你的问题没有一个正确的答案,但我会尝试在这里解释一种常见的、惯用的方式。
两个兄弟视图不应该互相了解。相反,他们应该通过某种中介者通过事件进行交互。因为在你的情况下FilterView
and 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);
}
});
或者(最好甚至)你可以省去中间人并使用Mediator http://addyosmani.com/largescalejavascript/#mediatorpattern图案。为此,您需要第三个组件,其工作是在互不相识的各方之间传递消息。如果您使用的是 Backbone 0.9.9,则内置了这样一个中介器:Backbone
为此,根对象充当全局事件总线。
So:
//ListSubView
this.listenTo(Backbone, "listfilterchanged", this.filterChanged);
//FilterView
Backbone.trigger("listfilterchanged", filterValue);
接下来的问题是谁应该对列表数据负责。我倾向于让最专业的组件来负责,但这样只有one组件负责。在你的情况下,这意味着ListSubView
应该管理过滤列表,但前提是ParentView
不需要对其进行操作。但这只是一个概括,因此请持保留态度,并根据您的情况采取适合您的做法。