2014-02-27 262 views
2

好了,所以我有一个控制器,它的模型设置如下:灰烬PromiseArray sortBy

App.MyModel = DS.Model.extend({ 
    myOtherProperty: attr(), 
    mySortKey: attr(), 
    mySubCollection: function() { 
     return this.store.filter('MyOtherModel', function (myOtherModel) { 
      //Some basic filtering logic (it's actually more complex than this) 
      return myOtherModel.get('someProperty') == this.get('myOtherProperty'); 
     }); 
    }.property('myOtherProperty') 
}) 

实际的过滤功能并不重要 - 重要的是,该“mySubCollection”计算属性返回DS.PromiseArray对象。上述模型的控制器的类型是'Ember.ObjectController',因为它只显示一个对象。

显示此属性的模板使用的{{每个}}帮手这样做:

MyTemplate的:

{{#each mySubCollection}} 
    {{view App.MyView}} 
{{/each}} 

现在 - 我需要排序的“mySortKey”这个承诺数组属性按降序排列。我怎样才能做到这一点?该文档说DS.PromiseArray从Ember.Array扩展,但在'mySubCollection'的计算属性的末尾添加'sortBy('mySortKey:desc')'会导致它断开而不工作 - 这很有意义,因为我会在一个承诺而不是数组上调用'sortBy'。

我看了一堆不同的想法,不断提出的是切换到使用ArrayController。我可以做到这一点,但这并不理想,因为它在一个非常简单的设置上增加了一些复杂性,这些设置已经很好(除了排序)。

有什么想法?

回答

9

我还没有完全弄清楚为什么sortBy不能在PromiseArray上工作。但这里是我作为一个变通方法使用:

sortedCollection: function() { 
    return Em.ArrayProxy.createWithMixins(Em.SortableMixin, { 
     content: this.get('mySubCollection'), 
     sortProperties: [this.get('mySortKey')], 
     sortAscending: false 
    }); 
}.property('mySubCollection', 'mySortKey') 
+0

我喜欢这个想法,这是一个很好的展示mixins的方式......谢谢!我会试一试,如果它有效,我会给你答案 –

+1

作品像一个魅力 - 谢谢! –

+0

这仍然是已知的做事方式吗? – Anthony

4

Ember.SortableMixin已被弃用,使用Ember.computed.sort代替。

App.MyModel = DS.Model.extend({ 
    myOtherProperty: attr(), 
    mySortKey: attr(), 
    mySubCollection: ... 
    sortedCollection: Ember.computed.sort('mySubCollection', function(a, b){ 
     # compare logic 
     return a.get('time') - b.get('time'); 
    } 
})