2014-02-27 156 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'); 
    } 
})