Backbone.js 同一父视图下的两个看似独立的视图应该如何交互 请考虑以下情况: <ParentView> <FilterSubview></FilterSubview> <ListSubview></ListSubview> </ParentView>
举个例子:我有一个视图,它依次显示带有过滤器的视图(用户可以选择显示书籍、杂志或两者)和带有项目的列表。 过滤器和列表都有相应的模型。过滤器-我们可以过滤什么。列表-所有项目的列表 用例:用户看到完整列表,然后可以通过仅选择所需类别来过滤结果 问题:Backbone.js 同一父视图下的两个看似独立的视图应该如何交互 请考虑以下情况: <ParentView> <FilterSubview></FilterSubview> <ListSubview></ListSubview> </ParentView>,backbone.js,Backbone.js,举个例子:我有一个视图,它依次显示带有过滤器的视图(用户可以选择显示书籍、杂志或两者)和带有项目的列表。 过滤器和列表都有相应的模型。过滤器-我们可以过滤什么。列表-所有项目的列表 用例:用户看到完整列表,然后可以通过仅选择所需类别来过滤结果 问题: 这两种观点应该如何互动?他们应该相互了解还是应该由父视图处理 谁应该存储要显示的筛选列表?它可以是直接的列表子视图模型,或者父视图可以过滤完整的列表,然后将其传递给渲染 对于您的问题,没有一个正确的答案,但我将尝试在这里解释一种常见的惯用方法 两
- 这两种观点应该如何互动?他们应该相互了解还是应该由父视图处理
- 谁应该存储要显示的筛选列表?它可以是直接的列表子视图模型,或者父视图可以过滤完整的列表,然后将其传递给渲染
- 对于您的问题,没有一个正确的答案,但我将尝试在这里解释一种常见的惯用方法
两个兄弟视图不应该相互了解。相反,他们应该通过某种调解人通过事件进行互动。由于在您的情况下,
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);
}
});
或者(更喜欢,甚至)你可以剪一个中间人,然后使用这个模式。为此,您需要第三个组件,其工作是在不应该相互了解的各方之间传递消息。如果您使用的是主干网0.9.9,那么内置了这样一个中介体:主干网
根对象为此充当全局事件总线
因此:
然后是谁应该对列表数据负责的问题。我倾向于让最专业的部门负责,但这样只有一个部门负责。在您的情况下,这意味着
ListSubView
应该管理过滤列表,但前提是ParentView
不需要对其进行操作。不过,这只是一个泛化,所以还是要谨慎行事,做你认为合适的事情。谢谢你,我也不知道主干本身可以起到调停者的作用。虽然我相信使用公共父级连接视图会更好,而不是一直移动到主干本身。
//ListSubView
this.listenTo(Backbone, "listfilterchanged", this.filterChanged);
//FilterView
Backbone.trigger("listfilterchanged", filterValue);