8

我希望能够对ArrayController内容来自 ember-data 查询的内容进行排序。不幸的是,sortProperty在这种情况下,mixin 似乎不起作用。

我希望能够做到以下几点:

App = Ember.Application.create();
App.store = DS.Store.create({ revision: 4});

App.Item = DS.Model.extend({
    id: DS.attr('string'),
    name: DS.attr('string')
});

App.store.createRecord(App.Item, {id: '4', name: 'banana' });
App.store.createRecord(App.Item, {id: '2', name: 'apple'});
App.store.createRecord(App.Item, {id: '6', name: 'spaghetti'}); 

App.ItemsController = Ember.ArrayController.create({
    content: App.store.findAll(App.Item),
    sortProperties: ['name']
});

使用最新版本的EmberEmber-data,这给出了输出:

[ id: 4, name: banana ]

[ id: 2, name: apple ]

[ id: 6, name: spaghetti ]

这里的问题是App.store.findAll()返回RecordArray的内容属性不仅仅是一个App.Item实例数组(在这种情况下,内容是 [2, 3, 4])

要真正掌握实例,我需要使用类似objectAt(). 但即使我App.Item从 中提取实例RecordArray并将它们转储到普通数组中,事情也不会按预期工作。

我是否错过了执行此操作的明显方法,或者这只是框架的当前状态?我宁愿不必为了对它们进行排序而将所有模型复制为普通对象。

编辑:

我通过自己定制解决了这个问题ArrayController。不过,如果事情像上面那样工作,那就太好了。

编辑#2:

原始车把模板:

<script type="text/x-handlebars">
    {{#each App.ItemsController.content }}
        <p>[ id: {{id}}, name: {{name}} ]</p>
    {{/each}}
</script>

(另外,我在上面的代码中使用了sortProperty属性而不是sortProperties,但这只是一个错字。)

是的,如果有人改为使用

<script type="text/x-handlebars">
    {{#each App.ItemsController.arrangedContent }}
        <p>[ id: {{id}}, name: {{name}} ]</p>
    {{/each}}
</script>

然后我们得到我们想要的:

[ id: 2, name: apple ]

[ id: 4, name: banana ]

[ id: 6, name: spaghetti ]
4

4 回答 4

11

我有同样的问题。花了我一段时间,但最终这个通用解决方案解决了它:

App.ArrayController = Ember.ArrayController.extend({
  sortProperties: ['id'],
  sortAscending: true,

  sortedContent: (function() {
    var content;
    content = this.get("content") || [];
    return Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, {
      content: content.toArray(),
      sortProperties: this.get('sortProperties'),
      sortAscending: this.get('sortAscending')
    });
  }).property("content.@each", 'sortProperties', 'sortAscending'),

  doSort: function(sortBy) {
    var previousSortBy;
    previousSortBy = this.get('sortProperties.0');
    if (sortBy === previousSortBy) {
      return this.set('sortAscending', !this.get('sortAscending'));
    } else {
      set('sortAscending', true);
      return this.set('sortProperties', [sortBy]);
    }
  }
});

现在我的大多数 ArrayControllers 扩展App.ArrayController而不是Ember.ArrayController,特别是那些以 Ember/DataRecordArray作为内容的。

现在,在您的车把模板中,执行以下操作:

 {{#each item in sortedContent}}
   ...          
 {{/each}}

代替

 {{#each item in content}}
   ...          
 {{/each}}
于 2012-11-15T12:24:28.253 回答
6

从 Ember 1.1.2 和 ember-data 1.0.0-beta.3 开始,可能更早,只需在 Controller 上设置 sortProperties 就足够了。sortAscending可以设置为truefalse取决于您要排序的方向。

App.ArrayController = Ember.ArrayController.extend({
  sortProperties: ['name'],
  sortAscending: true
})

但是,请注意

sortProperties: ['id']

似乎是按词汇排序而不是按数字排序。我通过 created_at 时间戳绕过了词法排序,但可能还有另一种方法。

于 2013-11-07T01:57:09.423 回答
4

我遇到了类似的问题,并通过 我使用 sortBy() 方法的路线中的数组类的文档对其进行了整理。
所以在你的情况下,它可能类似于

App.store.findAll().sortBy('name');

我知道这是一个老问题,但如果有人像我这样偶然发现

于 2014-06-11T16:21:27.017 回答
3

从 Ember 版本 1.0.0-rc.4 开始 Ember.ArrayProxy.create(Ember.SortableMixin ....,它似乎不再工作了。使用 Ember.ArrayProxy.createWithMixins(Ember.SortableMixin ....或使用 Ember.ArrayController 中的内置排序功能。

于 2013-06-10T18:46:03.347 回答