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

Ember.js 在不使用阵列控制器的情况下,如何在余烬模型中实现排序?,ember.js,ember-data,ember-cli,Ember.js,Ember Data,Ember Cli,每一个谷歌结果都是关于ArrayController排序的。需要一个不使用ArrayController的排序机制 有一个模型,其中有排序参数。例如,将“sortOrder”作为模型中的属性之一(将来自后端) 将使用#each呈现此模型,但这应该基于sortOrder属性而不是模型的ID属性进行迭代。您只需要将一个属性包含到控制器或组件中,然后指定SortScending和sortProperties属性 Em.Controller.extend(Em.SortableMixin, { so

每一个谷歌结果都是关于ArrayController排序的。需要一个不使用ArrayController的排序机制

有一个模型,其中有排序参数。例如,将“sortOrder”作为模型中的属性之一(将来自后端)


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

您只需要将一个属性包含到控制器或组件中,然后指定
SortScending
sortProperties
属性

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

在这种情况下,我直接使用
Ember.ArrayProxy
Ember.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()

类似这样:

以下是我如何手动排序(使用余烬比较)


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

控制器
(而不是
阵列控制器
)中,您可以在下面定义一个新的计算属性,如
分拣机1,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'
的依赖性看起来与我相当。以上所有三个计算属性都生成相同的排序列表

请注意,在
SortDusers1,2
中,不能将
'sortProps'
参数替换为
'lastName'
——它将不起作用

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

sortProps: ['lastName:desc']
此外,如果模板位于用户/索引文件夹中,则控制器也必须位于该文件夹中。users/中的控制器不会这样做,即使路由加载模型位于users/中

在模板中,用法与预期一致:

    <ul>
        {{#each sortedUsers1 as |user|}}
            <li>{{user.lastName}}</li>
        {{/each}}
    </ul>
    {{{#每个分拣器1作为|用户}
  • {{user.lastName}
  • {{/每个}}

排序机制:
stuff.sort()
。(含糊不清的问题,无用的回答。你可能想扩展你的用例。首先,你想分类什么?你将如何使用它?)谢谢你!我看到ArrayController将在2.0中被弃用,但文档中没有解释如何迁移排序。(除了模糊地提到SortableMixin,它在api文档中还没有被标记为弃用)。这个答案是我能找到的唯一可以解释另一个选择的地方。我完全在同一条船上,学习这些东西,并且左右碰壁。Ember 2.0不赞成使用很多东西,但通常不清楚该使用什么(除非您密切关注Ember开发,而我们大多数人都不这么做)。如果您希望将来验证您的代码,值得记住的是,这个解决方案最终也会停止工作。如何在更改模型的排序属性后刷新每个列表?我不久前放弃了Ember,因为我不喜欢系统中的复杂性随着时间的推移而增长,因此无法帮上忙。希望社区中有人能回答。或者,仅仅提出一个新的问题以便更快地被注意可能更容易。抱歉。现在,您应该使用计算属性,如下面的答案所述。是的,谢谢@toranb。您认为哪种方式更好?@arystak只取决于您的ember版本/您是否使用ArrayController或是否使用最新的ember(例如,不使用SortableMixin)。两者都是有效的——我希望展示“从头开始”的版本:)这比在控制器上计算好,因为从理论上讲,您可以在访问数据的任何地方对数据进行排序。实际上,您是否可以在从api接收到的ember数据中有一个适配器来对其进行排序?它会在商店里分类吗?
    <ul>
        {{#each sortedUsers1 as |user|}}
            <li>{{user.lastName}}</li>
        {{/each}}
    </ul>