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
Javascript 分离“主干”集合(事件问题)_Javascript_Backbone.js_Marionette_Backbone Events_Backbone.js Collections - Fatal编程技术网

Javascript 分离“主干”集合(事件问题)

Javascript 分离“主干”集合(事件问题),javascript,backbone.js,marionette,backbone-events,backbone.js-collections,Javascript,Backbone.js,Marionette,Backbone Events,Backbone.js Collections,所以,接下来的问题是:我收到了大量的价格集合,并且有特定的价格,比如说,合作伙伴的价格。因此,集合包含一些由partner_id表示的组 我使用initialize方法中的collection.filter筛选此集合,以便为后续视图获取不同格式的数据 var BasePrices = new Collections.ProductPrices( // Creating the same collection type this.model.get('prices').filter(fun

所以,接下来的问题是:我收到了大量的价格集合,并且有特定的价格,比如说,合作伙伴的价格。因此,集合包含一些由partner_id表示的组

我使用initialize方法中的collection.filter筛选此集合,以便为后续视图获取不同格式的数据

var BasePrices = new Collections.ProductPrices( // Creating the same collection type
    this.model.get('prices').filter(function (m) { // But a bit narrowed
        return ~~m.get('partner_id') === 0; // leaving prices without `partner_id`
    })
);
稍后,我将这个新完成的集合传递给管理基本价格列表的视图

问题本身是,我订阅的是这个新完成的集合的事件,但是之后保留在那里的模型的事件。筛选器正在将它们的事件触发到这个.model.get'prices下的旧集合,但是新添加的模型将它们的事件正确地触发到BasePrices集合

我不明白为什么会这样。我可以假定有smth。与模型引用到集合model.collection属性有关,但为什么在我创建全新集合时它没有更新,以及如何解决此问题?

而问题确实出在引用和克隆中,实际上不是克隆。关键是我们需要将所有内容克隆到新集合中。克隆不是复制,不是我们知道的通过引用传递-克隆

!!更优雅的方法来解决这个问题是高度赞赏的

UPD:为了保持链接的一致性,这里有一行代码


如果创建过滤的集合只是为了在视图中使用它,那么使用原始集合并让视图仅渲染所需的项目会更好、更正确。例如,在view类中:

render: function() {
    this.model.each(function(m) {
         if(~m.get('partner_id') === 0)
             return;
         /* render m here */
    });
}
其基本原理是视图代表原始集合

如果需要同一集合的多个筛选视图,可以对所有视图使用单个视图类,并向其传递筛选函数:

initialize: function(filter) {
    this.filter = filter;
}
render: function() {
    this.model.each(function(m) {
         if(!this.filter(m))
             return;
         /* render m here */
    });
}

然后创建如下视图:新建FilteredViewfunctionm{return~~m.get'partner_id'==0;}

在创建过滤后是否需要原始集合?@Spike,是的。我正在从检索到的数据创建几个集合。这个过滤是第一个。这几个集合和这个过滤的集合是只用于视图,还是在视图之外使用它们进行计算等?@Spike,很抱歉回答得太晚了。是的,我稍后将使用这些集合来计算结果数据。这不仅仅是将它们传递给视图和渲染。多亏了我的努力,我尝试了过滤函数来过滤视图中不必要的模型,作为第一种方法,但主集合的导数是紧密耦合的,后者取决于,比方说,第一个集合的长度,因此仅过滤在我的例子bec中不太适用。集合仍然包含我检索到的所有模型,这就是我实际解决的问题。
render: function() {
    this.model.each(function(m) {
         if(~m.get('partner_id') === 0)
             return;
         /* render m here */
    });
}
initialize: function(filter) {
    this.filter = filter;
}
render: function() {
    this.model.each(function(m) {
         if(!this.filter(m))
             return;
         /* render m here */
    });
}