如何在Ember.js中对hasMany项进行排序

时间:2014-06-07 16:42:44

标签: javascript ember.js ember-data

我有这个结构:

App.Router.map(function() {
    this.resource('board', {path: '/board'}, function() {
        this.route('new', {path: '/new'});
        this.route('show', {path: '/show/:board_id'});
    });
});

App.Board = DS.Model.extend({
    title: DS.attr('string'),
    initialAmount: DS.attr('number'),
    initialDate: DS.attr('date'),
    boardItems: DS.hasMany('BoardItem'),
    _csrf: DS.attr()
});

App.BoardItem = DS.Model.extend({
    title: DS.attr('string'),
    income: DS.attr('number'),
    outcome: DS.attr('number'),
    date: DS.attr('date'),
    itemType: DS.attr('string'),
    board: DS.belongsTo('Board')
});

App.BoardShowRoute = Ember.Route.extend({
    model: function(params) {
        return this.store.find('board', params.board_id).sort();
    }
});

并且在视图中,我列出了这样的电路板项目:

{{#each boardItems}}

我想要做的是按日期对boardItems进行排序,我无法找到一种方法...... 任何想法?

谢谢!

2 个答案:

答案 0 :(得分:8)

您应该在视图后面的控制器中创建一个计算属性

控制器

App.BoardShowController = Em.ObjectController.extend({
  sortedBoardItems: function(){
    return this.get('boardItems').sortBy('date');
  }.property('boardItems.@each.date')
});

模板

{{#each sortedBoardItems}}

答案 1 :(得分:4)

您可以使用{{#each}}...{{/each}}帮助程序包装{{render}}循环并在控制器中进行排序:

控制器:

App.BoardItemsController = Ember.ArrayController.extend({
  sortProperties: ['date'],
  sortAscending: false // newest first
});

模板:

{{#render "boardItems" boardItems}}
  {{#each arrangedContent}}
     Title: {{title}}
     ...
  {{/each}}
{{/render}}

每次boardItems更改时,使用computed属性进行排序将导致完全重新计算已排序的数组。对于此处描述的arrangedContent方法,情况并非如此。