コメントが長くなったので、比較するために2番目の回答を作成します。
まず、「完了」、「未完了」は完全に永続化されるアイテム モデル属性のように感じます。または、アイテムが多くのユーザーによって所有され、それぞれが独自の「完了」「未完了」状態を持っている場合、アイテムには completedState サブモデルなどがあります。ポイントは、@fguillenが2つの可能な解決策を作成したことですが、モデルに属性とほとんどの作業を行うボタン/ビューを含めるという2番目の方法も好みます。
私には、モデルが独自のカスタム イベントを持つことは意味がありません。フィルター ボタンは、適切なビューを提供するだけでよいように思えます。(どの項目を表示するか) したがって、ボタン要素で、コレクションに対して多かれ少なかれ直接フィルターを実行する関数を呼び出すようにします。
event: {
'click filterBtnCompleted':'showCompleted'
},
showCompleted: function(event) {
var completedAry = this.itemCollection.filter(function(item) {
return item.get('completed');
});
// Code empties your current item views and re-renders them with just filtered models
}
このような便利なフィルター関数をコレクション自体に隠しておく傾向があるため、次のように呼び出すことができます。
this.ItemCollection.getCompleted(); // etc.
これらの属性をモデルに残して、サーバー上で無視しても問題ありません。繰り返しになりますが、永続化したい属性のように思えます。
もう1つ、バックボーンのないプレーンな状態を使用するとイベントが犠牲になるとあなたは言いました。(ニヤニヤ :-) そうじゃない!オブジェクトを簡単に拡張して Backbone.Event 機能を持たせることができます。
var flamingo = {};
_.extend(flamingo, Backbone.Events);
これで、flamingo トリガーを使用して、他のものと同じようにイベントをリッスンできます!
編集: ルータに対処する > データ取引を見る -------------------//
私がルーターで行うことは、あなたが行うことではないかもしれませんが、私の appView をオプションとしてルーターに渡します。サブビューを作成する showView() という appView の関数があります。したがって、ルーターは、私が扱っているビューにほとんど直接アクセスできます。
// Router
initialize: function(options) {
this.appView = options.appView;
}
私たちの場合、完成したアイテムを表示するためにフィルタリングする必要があるのは itemsView かもしれません。注: サブビューを管理する showView() 関数もあります。シナリオで appView を直接操作しているだけかもしれません。
/items/#completed のようなルートが呼び出されたとき、私はこのようなことをするかもしれません。
routes: {
'completed':'completed'
},
completed: {
var itemsView = ItemCollectionView.create({
'collection': // Your collection however you do it
});
this.appView.showView(itemsView);
itemsView.showCompleted(); // Calls the showCompleted() from View example way above
}
これは役に立ちますか?