分离`Backbone`集合(事件问题)

时间:2015-10-01 14:18:22

标签: javascript backbone.js marionette backbone-events backbone-collections

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

我过滤了这个集合(collection.filter()方法中使用initialize),以获得不同的"格式"后续观点的数据。

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

稍后我将这个新完成的集合传递给管理基本价格列表的视图。

问题本身就是我订阅这个新完成的集合的事件,但是.filter()之后模型的事件this.model.get('prices')下的旧集合发送事件但新添加的模型正确 BasePrices集合)。

我无法理解为什么会这样。我可以假设有smth。与模型到集合(model.collection属性)的引用相关,但是为什么在创建全新集合时它没有更新以及如何解决问题?

2 个答案:

答案 0 :(得分:0)

问题确实在引用和克​​隆不是克隆,实际上)。关键是我们需要克隆所有内容到新集合。克隆...不复制,不传递(引用,因为我们知道) - 克隆

var BasePrices = new Collections.ProductPrices() // Creating the same collection type

_(this.model.get('prices').models) // Implicitly `_.chain`ing
    .filter(function (m) { return ~~m.get('partner_id') === 0; }) // leaving prices without `partner_id`
    .map(function (m) { return m.toJSON(); }) // converting each model to raw object
    .tap(function (a) { c.add(a); }) // adding all models at once
    .value(); // evaluating chain

非常感谢更优雅的解决此问题的方法。

UPD:只是为了保持chain一致,这是lodash的单行。

var BasePrices = _(this.model.get('prices').models)
        .filter(function (m) { return ~~m.get('partner_id') === 0; })
        .map(function (m) { return m.toJSON(); })
        // creating collection passing all models in constructor
        .thru(function (a) { return new Collections.ProductPrices(a); })
        .value();

答案 1 :(得分:0)

如果您只是为了在视图中使用它而创建过滤后的集合,那么使用原始集合并让视图仅呈现所需的项目会更好(也更正确)。例如(在视图类中):

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

理由是视图代表原始集合。

(如果您需要同一个集合的多个过滤视图,则可以为所有这些视图使用单个视图类并将其传递给过滤器函数:

new FilteredView(function(m) {return ~~m.get('partner_id') === 0;}

然后创建一个这样的视图:Enum.do_any?