1

オブジェクトのコレクションがあるが、それらのオブジェクトに関するより高度な情報も保存したい場合、コレクションにモデルの動作を追加することは適切ですか?

私の状況では、「curPath」というブール フィールドを持つアプリケーション パスのコレクションを探しています。変更された場合、コレクションは現在のページを示すフラグを設定する必要があります。このように、外部のオブザーバーは、パス コレクション内のすべてのモデルではなく、1 つのフィールドのみを観察する必要があります。

これは次のようになります。

var PathModel = Backbone.Model.extend({})
var PathCollection = Backbone.Collection.extend({
  initialize: function(){ this.model = PathModel }
})
// I want to be able to set observable properties on the collection, so...
var PathManager = _.extend(Backbone.Model, PathCollection)

// Then maybe I can do something like this?
PathManager.each(function(pathModel){
  pathModel.on('change:curPath', function(m, value, o){
    // I mean for 'this'.set to point to the instance of the PathManager
    if (value === true){ this.set('curPath', pathModel.get('id')) } 
  }, this)
}, this)

観察可能な動作をコレクション (コレクション + モデル > モデル) に追加するのは適切ですか、それとも全体にラッピング モデルを追加する必要がありますか (モデル > コレクション > モデル)、または他の解決策はありますか?

4

1 に答える 1

0

Model と Collection のメソッドのいくつかは競合を引き起こす同じ名前を持ち、Backbone の将来のバージョンへの更新で問題が発生する可能性があるため、このパターンには反対することをお勧めします。その代わりに、PathManager クラスを作成し、PathCollection を初期化して、このモデルのパス プロパティとして設定します。あなたの言っていることからすれば

var PathManager = Backbone.Model.extend({
    initialize: function() {
        this.paths = new PathCollection();
    }
});

var pathManager = new PathManager();

pathManager.paths.add({ /* new path */ });
pathManager.on('change', doSomething);
pathManager.paths.on('add', doSomethingElse);

私はそれをこのようなものにします

于 2012-11-15T12:09:16.273 に答える