我正在编写Code School的Ember.js课程,他们首先在控制器中使用过滤器方法,解释控制器用于装饰模型。但是在接下来的部分中,他过滤了Route中的记录,将方法链接到'store.findAll'。
我对Ember比较新,所以这很令人困惑。在第一个实例中,我们有一系列产品,我们希望过滤这些产品以检索要在索引模板中发布的onSale产品数组。我们在索引路线上检索了模型:
App.IndexRoute = Ember.Route.extend({
model: function() {
return this.store.findAll('product');
}
});
然后路线将产品发送到控制器,在那里我们可以装饰数据并将其减少到只有3种产品。
App.IndexController = Ember.ArrayController.extend({
onSale: function() {
return this.filterBy('isOnSale').slice(0, 3);
}.property('@each.isOnSale')
});
我明白这一点。但随后我们创建了一个指向'products / onsale'模板的链接,该模板将列出所有onsale产品。我们创建了一个ProductsOnsaleRoute,我们使用modelFor从ProductsRoute中提取父模型,然后我们继续在Route中过滤而不是创建ProductsOnsaleController并在那里过滤。对此有解释吗?
App.ProductsOnsaleRoute = Ember.Route.extend({
model: function() {
return this.modelFor('products').filterBy('isOnSale');
}
});
我想我的问题是......创建一个ProductsOnsaleController并在那里过滤会更好吗?
App.ProductsOnsaleController = Ember.ArrayController.extend({
sale: function() {
return this.filterBy('isOnSale');
}
}):
感谢您的帮助!
答案 0 :(得分:6)
巧合的是,我今天和我的团队负责人正在谈论这个话题。他提出了一个非常有效的观点,即在Route级别过滤的麻烦在于它不是“绑定意识”。
假设您决定过滤确定是否应显示项目的属性。如果在控制器级别执行过滤,则用户操作可以从显示中删除项目。如果您的过滤是在路线的setupController
中完成的,那么情况并非如此;您必须重新访问要删除的项目的路线。