【问题标题】:How do I sort models using only a route in Ember?如何在 Ember 中仅使用路线对模型进行排序?
【发布时间】:2015-07-09 13:00:56
【问题描述】:

在过去,您可以使用 ArrayControllers(在 1.13.0 中已弃用),我们知道很快将不推荐在 ember 中使用控制器。目前是否可以仅使用我的路线对我的模型进行排序?

/routes/orders.js

import Ember from 'ember';

export default Ember.Route.extend({
  model: function() { return this.store.findAll('order'); }
});

我将如何以“名称”为例进行排序,但仅使用路线?

请注意,这个问题类似于How to sort model in Ember.js? - 但可以通过任何方法进行,而我的问题是仅使用路线(如果可能的话)。

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    这似乎可以完成工作,除非我遗漏了什么。

    export default Ember.Route.extend({
      model: function() { 
        return this.store.findAll('order') .
          then(orders => orders.sortBy('name'));
      }
    });
    

    【讨论】:

    • 我必须将它写成.then(function(orders) { return orders.sortBy('id'); });,但除此之外它工作得很好。
    • 是否可以使用 asc/desc 模式?我尝试在 API 中搜索此类方法但没有成功;(
    • 注意上面的代码发布 Ember data 2.x - 如果你要进行排序,我建议你做return this.store.findAll('order', {reload: true})
    • @Knightsy 为什么需要添加“reload: true”选项?
    • @Kim 我已经发布了一个更详细的答案,这将对 Ember 2.x 用户更有帮助
    【解决方案2】:

    Ember 2.0 发布新答案

    尽管问题仍然存在,并且 torazaburo 的答案在 Ember 2.0 之前效果很好。现在最好的答案是“不要仅使用路由对模型进行排序”——而是在控制器中进行排序,或者如果您不想使用控制器,则在组件中进行排序。

    Ember 2.0 之后的重新加载行为有一个很大的“陷阱”。如果 store 中已经有记录,并且您没有在 findAll 的选项中指定 { reload: true },那么 findAll 方法将立即使用这些记录解析,这意味着 then 仅使用您已经拥有的那些记录进行排序。因此,当实际后台请求仍在进行时,您的模型可能会返回有限数量的记录。有关详细信息,请参阅 DS 商店文档。

    因此,基于先前接受的答案的改进代码是:

    export default Ember.Route.extend({
      model: function() { 
        return this.store.findAll('order', { reload: true }).
          then(orders => orders.sortBy('name'));
        }
    });
    

    但如前所述,我认为最好的做法是不要仅仅依赖于路由,而是在控制器或组件中使用计算排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多