ビューに単一の属性のみが表示されている場合 (たとえば、モデルのブール属性を表示するチェックボックスの場合) 、Backbone docsで説明されているように、その属性の 'change:attribute_name' イベントをリッスンする必要があります。
ビューがより複雑で、複数のモデル属性に依存している場合 - たとえば、「done」、「text」、および「dueDate」要素を持つ「To Do」リスト項目のビューである場合は、「change」イベントをリッスンします。 . この場合、各イベントですべての要素を更新することを選択するか、changedAttributes() を使用して更新が必要な要素を決定することができます。
説明する ...
「change:attribute_name」イベントを使用して属性を更新します。
このスタイルは、レンダリングされるモデル属性の数が 3 未満程度の単純なビューに適しています。それ以上だと、コードが少し面倒になります。
model.bind('change:done', function() {
view.doneElement.checked = model.get('done');
});
model.bind('change:text', function() {
view.textElement.value = model.get('text');
});
model.bind('change:dueDate', function() {
view.dueDateElement.value = model.get('dueDate');
});
「変更」イベントですべてを更新します。
このスタイルは、4 つ以上の属性をレンダリングする複雑なビューに適しています (3/4 の属性数は、主に私の個人的な意見に基づく大まかなガイドラインです)。
model.bind('change', function() {
view.doneElement.checked = model.get('done');
view.textElement.value = model.get('text');
view.dueDateElement.value = model.get('dueDate');
});
これの欠点は、変更があると、ビューのすべての要素が更新されることです。したがって、たとえば、todo アイテムを「完了」としてマークすると、テキストが再レンダリングされ、そこで選択していたものが失われる可能性があります。そのようなことが問題になる場合もあれば、そうでない場合もあります。ビューが正確に何をしているかに基づいて決定する必要があります。
最後の「変更」イベント以降に変更されたもののみを更新します。
これは、上記のより微妙なバリエーションであり、両方のアプローチの長所を組み合わせています。changedAttributes() の結果に基づいて、更新が必要なビュー要素を更新します。
model.bind('change', function() {
var diff = model.changedAttributes();
for (var att in diff) {
switch(att) {
case 'done':
view.doneElement.checked = model.get('done');
break;
case 'text':
view.textElement.value = model.get('text');
break;
case 'dueDate':
view.dueDateElement.value = model.get('dueDate');
break;
}
}
});
最後に、表示されている値のハッシュをビューに格納し、それを changedAttributes() メソッドに渡すという、さらに別のバリエーションがあることに注意してください。これは通常は必要ないため、ここで詳細を説明するのは退屈ではありません。