【问题标题】:Sorting ember-data live array in route model hooks在路由模型挂钩中对 ember-data 实时数组进行排序
【发布时间】:2015-03-25 18:15:26
【问题描述】:

在 ember 路由的模型钩子中,以下工作正常:

model: function () {
    return this.modelFor('foo').get('bar');
}

在 ember-data 的支持下,我可以在其他地方删除 foo 的一些条形图,它会自动更新(实时数组)。

现在,我希望对它进行排序(以及子路由中的用户,所以我必须在路由中执行此操作,而不是在控制器中)。

model: function () {
    return this.modelFor('foo').get('bar')
       .then(function (data) {
        return data.sortBy('baz');
    });
},

... 只在第一次完成这项工作,因为我正在失去更新。

有没有办法编写自动更新排序? ember 有什么办法解决这个问题?

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    根据 Gaurav 的回答回答我自己的问题:

     model: function () {
        return this.modelFor('foo').get('bar')
            .then(function (data) {
                return Ember.ArrayProxy.extend({
                    arrangedContent: Ember.computed.sort('content', 'props'),
                    props: ['baz:asc']
                }).create({
                    content: data});
            });
    },
    

    【讨论】:

    • 谢谢,在这里工作。有更短的方法吗? Ember 似乎有很多样板。我希望像this.store.find('post').sortBy(['baz:asc'])
    • find 返回一个承诺,所以你必须等待.then(...)。现在,您已经非常接近我的问题中显示的代码了,该代码仅在第一次出现时才有效。我不知道 sortBy 的替代品会返回一个实时数组。显然,您可以自己实现。到目前为止,我只在两个地方需要这个构造,所以我没有走那条路。
    【解决方案2】:

    您可以为您的模型创建一个 Ember 对象,该对象具有作为排序数据的计算属性。

    model: function () {
        return this.modelFor('foo').get('bar')
           .then(function (data) {
                return Ember.Object.extend({
                    arrangedData: Ember.computed.sort('model', 'props'),
                    props: ['baz:asc']
                }).create({ model: data });
           });
    },
    

    Ember.Object.extend 部分可能应该被提取到某个地方,以便在其他路由中重复使用。

    【讨论】:

    • 谢谢,这让我想到了正确的方向。道具必须是一个数组才能工作。此外,有了这个我必须在模板中写{{model.arrangedData.baz}}。我通过使用 ArrayProxy 扩展了它并添加了我自己的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多