我想按日期对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
那么获取这些数据的排序列表的最佳方法是什么?
答案 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());