所以,接下来的问题是:我收到大量的价格,而且有特定的,比如合作伙伴的价格。因此,集合包含由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
属性)的引用相关,但是为什么在创建全新集合时它没有更新以及如何解决问题?
答案 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?
)