15

だから私は更新された属性を持つモデルを設定しています。

次に、私の見解では、このモデルの変更イベントをリッスンしています。

それが発火したら、model.changedAttributes を使用する必要があると思いますか? コールバックを渡しますか?

更新されたすべての属性のハッシュ、または新しいものを返す必要がありますか? 更新されたものと新しいものを知る方法はありますか?

この変更された属性のハッシュを取得したら、どのように更新すればよいですか? オブジェクトを属性のタイプに解析しますか、それとも最初から高解像度のリスナーを使用する必要がありますか?

ありがとう!

4

2 に答える 2

31

ビューに単一の属性のみが表示されている場合 (たとえば、モデルのブール属性を表示するチェックボックスの場合) 、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() メソッドに渡すという、さらに別のバリエーションがあることに注意してください。これは通常は必要ないため、ここで詳細を説明するのは退屈ではありません。

于 2011-09-16T12:43:07.983 に答える
0

バックボーンのドキュメントに従って、変更イベントはモデルとモデルのコレクションをイベント ハンドラーに渡します。

変更が発生した後にイベントが発生するため、渡されたモデルには変更が含まれます。

「変更」イベントでは、どの属性が変更または追加されたかを知ることはできません。個々の属性に基づいてアクションを実行する必要がある場合は、「change:attribute」イベントを使用します。

于 2011-09-16T12:33:52.120 に答える