Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 同一父视图下的两个看似独立的视图应该如何交互 请考虑以下情况: <ParentView> <FilterSubview></FilterSubview> <ListSubview></ListSubview> </ParentView>_Backbone.js - Fatal编程技术网

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);