请考虑以下情况:
<ParentView>
<FilterSubview></FilterSubview>
<ListSubview></ListSubview>
</ParentView>
为您提供示例:我有一个视图,它反过来显示带过滤器的视图(用户可以选择显示书籍,杂志或两者)和带有项目的列表。 过滤器和列表都有相应的型号。过滤 - 我们可以过滤什么。列表 - 所有项目的列表。
用例:用户可以看到完整列表,然后只需选择所需类别即可过滤结果。
问题:
答案 0 :(得分:6)
你的问题没有一个正确的答案,但我会尝试在这里解释一种常见的,惯用的方法。
两个兄弟视图不应该彼此了解。相反,他们应该通过某种调解员通过事件进行互动。由于在您的情况下,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);
}
});
或者(最好,甚至)你可以剪掉一个中间人并使用Mediator模式。为此,您需要第三个组件,其任务是在不应该彼此了解的各方之间传递消息。如果您正在使用Backbone 0.9.9,那么就是内置的这样的中介:Backbone
根对象用作此目的的全局事件总线。
所以:
//ListSubView
this.listenTo(Backbone, "listfilterchanged", this.filterChanged);
//FilterView
Backbone.trigger("listfilterchanged", filterValue);
然后是谁应该对列表数据负责的问题。我倾向于让最专业的组件负责,但只有一个组件负责。在您的情况下,这意味着ListSubView
应该管理已过滤的列表,但前提是ParentView
不需要对其进行操作。这虽然只是一种概括,所以请耐心等待,为你的情况做正确的事。