如何在不使用阵列控制器的情况下在Ember模型中实现排序?

时间:2015-05-22 02:20:56

标签: ember.js ember-data ember-cli

每个google结果都与ArrayController排序有关。需要一个不使用ArrayController的排序机制。

有一个模型,其中有排序参数。就像说'sortOrder'作为模型中的一个属性(它将来自后端)。

将使用#each呈现此模型,但这应该基于sortOrder属性而不是模型的ID属性进行迭代。

4 个答案:

答案 0 :(得分:30)

在Ember 2.0 SortableMixin已被弃用,并且即将推出。

Controller(不是ArrayController)中,您可以在下面定义一个新的计算属性,如SortedUsers1,2,3

export default Ember.Controller.extend({
    sortProps: ['lastName'],
    sortedUsers1: Ember.computed.sort('model', 'sortProps'),
    sortedUsers2: Ember.computed.sort('content', 'sortProps'),
    sortedUsers3: Ember.computed('content', function(){
        return this.get('content').sortBy('lastName');
    })
});

上面的假设是模型本身是一个用户数组,lastName作为用户属性之一。对'model''content'的依赖看起来与我相同。上面的所有三个计算属性都生成相同的排序列表。

请注意,您无法将'sortProps'参数替换为'lastName'中的sortedUsers1,2 - 它将无效。

要更改排序顺序,请将sortProps修改为

sortProps: ['lastName:desc']

此外,如果您的模板位于users / index文件夹中,那么您的控制器也必须在那里。即使路由加载模型在用户/.

中,用户/中的控制器也不会这样做

在模板中,使用情况符合预期:

    <ul>
        {{#each sortedUsers1 as |user|}}
            <li>{{user.lastName}}</li>
        {{/each}}
    </ul>

答案 1 :(得分:5)

以下是我手动排序(使用余烬比较)的方法

import Ember from "ember";
import { attr, Model } from "ember-cli-simple-store/model";

var compare = Ember.compare, get = Ember.get;

var Foo = Model.extend({
    orderedThings: function() {
        var things = this.get("things");
        return things.toArray().sort(function(a, b) {
            return compare(get(a, "something"), get(b, "something"));
        });
    }.property("things.@each.something")
});

答案 2 :(得分:3)

您只需要在控制器或组件中加入SortableMixin,然后指定sortAscendingsortProperties属性。

Em.Controller.extend(Em.SortableMixin, {
  sortAscending: true,
  sortProperties: ['val']
});

Here is a working demo.

答案 3 :(得分:0)

在这种情况下,我直接使用Ember.ArrayProxyEmber.SortableMixin

  

ArrayProxy包装实现Ember.Array的任何其他对象   和/或Ember.MutableArray,转发所有请求。这非常有用   对于许多绑定用例或其他情况有用   能够换出底层数组很有用。

例如,我可能有一个控制器属性:

sortedItems: function(){
        var items = Ember.ArrayProxy.extend(Ember.SortableMixin).create({content: this.get('someCollection')});
        items.set('sortProperties', ['propNameToSortOn']);
        return items;
}.property()

像这样:JSBin