Ember:对模型数组进行排序的非控制器方式是什么

时间:2015-10-23 18:14:54

标签: ember.js

我想按日期对Ember模型数组进行排序,但似乎所有旧文档都与控制器内的排序有关。在这种情况下,我需要在路径中获取模型时对此数组进行排序,以便将其发送到服务以对其执行操作。

我有两个模型,网站和航班。

所以我有一个对象网站,其构造函数是myApp@model:site

我希望得到一个与该站点相关的飞行对象数组,其中有许多按日期排序的配置。

我的尝试是:

var flights = site.get('flights').sortBy('executeAt:desc');

我注意到一个奇怪的事情是没有“:desc”它默认为升序

var flights = site.get('flights').sortBy('executeAt'); - >升

但冒号之后的值不会影响任何事情

var flights = site.get('flights').sortBy('executeAt:'); - >降 要么 ``var flights = site.get('flights')。sortBy('executeAt:asc');` - >降

在某些情况下,它完全混淆了这种类型并给了我未分类的数据。

供参考,日期格式为:2015-09-03T13:34:33.000Z

那么获取这些数据的排序列表的最佳方法是什么?

3 个答案:

答案 0 :(得分:6)

最好的办法是使用Ember.computed.sort。以下是API文档:http://emberjs.com/api/classes/Ember.computed.html#method_sort

示例:

// components/site-widget.js
export default Ember.Component.extend({
  // The site model
  site: null,

  // List of flights
  flights: Ember.computed.alias('site.flights'),

  // Flights sorted in order
  sortedFlights: Ember.computed.sort('flights', '_flightSorting')
  _flightSorting: ['executeAt:desc']
});

用法:

// templates/sites.hbs
{{#each sites as |site|}}
  {{site-widget site=site}}
{{/each}}

在这种情况下,_flightStoring属性实际上是被观察到并且是可变的。更改它的值也会改变排序顺序。

如果您想进行自己的自定义排序,可以将其用作a / b函数。例如:

export default Ember.Component.extend({
  /* ... */

  sortedFlights: Ember.computed.sort('flights', function(a, b) {
    return a.executeAt > b.executeAt;
  })
});

我想借此机会无耻地插入Ember.computed.sortBy的Ember插件。如果您不需要可变排序,我建议您检查一下。 https://github.com/workmanw/ember-computed-sortby

我也有一个开放的RFC,希望这将被采用到Ember核心。 https://github.com/emberjs/rfcs/pull/87

更新:我创建了一个Ember Twiddle来帮助展示整个事物:http://ember-twiddle.com/60efa60e191fa9026774

我可能已经稍微带走了构建应用程序。但是与您的问题相关的文件是“components / flight-list.js”和“templates / components / site.hbs”。

答案 1 :(得分:1)

我还没有关联多个型号,但这是> 2.0方法处理排序 - 在不推荐使用sortable mixin之后。

var SomeCollection = Ember.Object.extend({
  content: [],
  sortProperties: ['someProperty:desc'],
  sortedContent: Ember.computed.sort('content', 'sortProperties'),
});

http://emberjs.com/api/classes/Ember.computed.html#method_sort

也许这会有所帮助。 :)

可能不适用于数组 ...然后你已经拥有的内容:http://emberjs.com/api/classes/Ember.Array.html#method_sortBy

答案 2 :(得分:1)

如果您想直接在路线中对模型进行排序,可以这样做:

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

(归功于torazaburo - How to sort model using only a route in ember?

对于降序,只需将.reverse()添加到数组中:

             ...
              .then(model => model.sortBy('attributeName').reverse());