我应该在Ember.js中过滤Route或Controller中的记录吗?

时间:2014-02-28 01:38:28

标签: ember.js

我正在编写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从ProductsRou​​te中提取父模型,然后我们继续在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');
  }
}):

感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

巧合的是,我今天和我的团队负责人正在谈论这个话题。他提出了一个非常有效的观点,即在Route级别过滤的麻烦在于它不是“绑定意识”。

假设您决定过滤确定是否应显示项目的属性。如果在控制器级别执行过滤,则用户操作可以从显示中删除项目。如果您的过滤是在路线的setupController中完成的,那么情况并非如此;您必须重新访问要删除的项目的路线。