あなたの質問に対する正しい答えは1つではありませんが、ここでは一般的な慣用的な方法を説明しようと思います。
2つの兄弟ビューはお互いを知っているべきではありません。代わりに、ある種のメディエーターを介してイベントを介して対話する必要があります。あなたの場合、両方FilterView
とListSubView
、両方のレンダリングを担当する共通の親ビューを共有しているため、親ビューにイベントを仲介させることができます。
var ParentView = Backbone.View.extend({
initialize: function() {
this.listenTo(this.filterView, "filter", this.filterChanged);
},
filterChanged: function(filterValue) {
this.listSubView.filter(filterValue);
}
});
var FilterView = Backbone.View.extend({
events: {
"change .filter" : "filterValueChanged"
},
filterValueChanged: function() {
var filterValue = //get filter value...
this.trigger("filter", filterValue);
}
});
あるいは(できれば)、仲介者を切り取ってメディエーターパターンを使用することもできます。そのためには、お互いを知らないはずの当事者間でメッセージを渡すことが仕事である3番目のコンポーネントが必要です。Backbone 0.9.9を使用している場合は、そのようなメディエーターが組み込まれています。Backbone
ルートオブジェクトは、この目的のためにグローバルイベントバスとして機能します。
それで:
//ListSubView
this.listenTo(Backbone, "listfilterchanged", this.filterChanged);
//FilterView
Backbone.trigger("listfilterchanged", filterValue);
次に、リストデータの責任者は誰かという問題があります。私は最も専門的なコンポーネントを担当することを好む傾向がありますが、そのため、担当するコンポーネントは1つだけです。あなたの場合、それはListSubView
フィルタリングされたリストを管理する必要があることを意味しますParentView
が、それを操作する必要がない場合に限ります。それは単なる一般化ですので、一粒の塩でそれを取り、あなたのケースに合っていると感じることをしてください。