@kyanny's blog

My thoughts, my life. Views/opinions are my own.

backbone.stickit のセレクタにマッチする要素が複数あるのに one-way binding の要素は無視され two-way binding しか動かない理由

サンプル https://github.com/kyanny/test-stickit app.js 参照。

view1 の h1 h2 はどちらも model の値で更新される。 view2 の input も同様。しかし view3 の h1 h2 は無視され input のみ値が更新される。なぜか。

getConfiguration の中で handler (モデルの属性値をビューに反映する具体的な方法を示すオブジェクト)を組み立てるときに、

  1. 一番 generic な handler として $el.text(val) というのが定義されている(この handler は特定の要素向けではないので selector がない)
  2. フォーム要素の場合はそれぞれ実装が複雑な handler が別に定義されている(input 要素用の handler も)
  3. セレクタに input 要素がマッチすると input handler が「利用可能な handler」として選択される
  4. handler は最終的に一個になるので generic handler と選択された handlers が _.extend でマージされる
  5. 最終的に得られる handler は selector が input 固定になるので他の要素には適用されない
  6. 結果として h1 h2 要素の値は更新されない

という理由。下のスクリーンショットでいうと、 handlers には三つのオブジェクトが入っていたが(左から generic handler, input handler, observe のマッピング情報)、 config では一つにまとめられてしまっている。この config が handler として使われるので...というからくり。

f:id:a666666:20150723204624p:plain