1

ダイアログビューが初期化されるときに、モデル属性のオブジェクトの配列を使用してコレクションを初期化するとします。次に、ユーザーがリストを編集できるダイアログビューで、モデルセットの呼び出しでこれらのモデル値が更新されます。ダイアログの[OK]ボタンをクリックすると、バックボーンは、コレクションが作成/初期化されてから変更されたモデルのみのリストを取得する方法を提供しますか?

4

1 に答える 1

3

魅力的に見えるさまざまなモデルメソッドがあります。

ただし、だまされないでください。これらは、"change"イベントがトリガーされているときにのみ適用されます。

この方法、および以下の変更関連の方法は、"change"イベントの進行中にのみ役立つことに注意してください。

したがって、イベントがトリガーされて処理された後は、それらは役に立ちません。

どのモデルが自分で変わったかを追跡する必要があると思います。コレクション自体でこれを行うことができます。

コレクション内のモデルでトリガーされるイベントは、便宜上、コレクションでも直接トリガーされます。

コレクションはそれ自体のイベントにバインドできます。たとえば、コレクションに次のようなものを含めることができます。

Backbone.Collection.extend({
    initialize: function() {
        this.delta = { };
        this.on('change',​​​​​ this._a_model_has_changed);
    },
    changed_models: function() {
        return _.chain(this.delta).values();
    },
    _a_model_has_changed: function(m) {
        this.delta[m.id] = m;
    }
});

次に、を呼び出すことで変更されたモデルを取得できますcollection.changed_models()。モデルが削除されたとき、またはサーバーと同期されたときにthis.deltaを更新できるように、他のイベントもリッスンする必要があります。上記は説明のためのものです。アンダースコアオブジェクトを返したくない場合は、代わりにこれを使用できます。

changed_models: function() {
    return _(this.delta).values();
}

しかし、できることcollection.changed_models().each(function() { ... })は便利です。

デモ: http: //jsfiddle.net/ambiguous/8PQh9/

モデルの同様のセットを使用して、モデルに自分の汚れを追跡させることもできます。次に、次のようなことを行うことができます。

collection.filter(function(m) { return m.is_dirty() });

もちろん、is_dirtyモデルが変更された場合はtrueが返されます。

于 2012-04-19T03:13:40.837 に答える