2014-06-06 59 views
1

我想弄清楚「Ember方式」做一個排序,當你沒有一個數組控制器依賴。沒有ArrayController排序hasMany關係

我創建了一個jsbin說明情況, 雖然我沒有能夠得到它的工作jsbin(雖然它在我的項目工作): http://emberjs.jsbin.com/mused/2/edit?html,js

FIX - 由於主銷這jsbin工作:http://emberjs.jsbin.com/quyawitu/5/edit

基本上,說你有兩種模式: 「豪斯醫生」 和 「窗口」

房子的hasMany窗口。窗戶屬於一棟房子。

現在說你是在看起來像這樣一個模板:

<script type="text/x-handlebars" data-template-name="index"> 
    <ul> 
    {{#each house in model}} 
     <li> 
     <div class="name"> 
      House name: {{house.name}} 
     </div> 
     <div> 
      First Window: {{house.firstWindow}} 
     </div> 
     </li> 
    {{/each}} 
    </ul> 
</script> 

在這個模板,我只是在鏈接到一個協會,窗戶沒興趣 - 不是,我找的第一個窗口(具體來說,第一個窗口,由createdAt排序)。

使用this question的答案,我使用了ArrayProxy和可排序的mixin在我的House模型上創建一個計算屬性以獲取此引用。我想知道是否有更通俗的「Ember方式」來做到這一點。

回答

1

升級餘燼和使用內置sortBy

你的具體情況,因爲你已經切換到固定適配器,這些項目都是異步的,所以我不得不改變一些的那些東西,使其工作在jsbin

firstWindow: function(){ 
    return this.get('windowsByCreatedAt.firstObject'); 
    }.property('windowsByCreatedAt.firstObject'), 

    windowsByCreatedAt: function() { 
    var arr = []; 
    this.get('windows').then(function(windows){ 
     arr.pushObjects(windows.sortBy('createdAt')); 
    }); 
    return arr; 
    }.property('[email protected]') 
}); 

http://emberjs.jsbin.com/quyawitu/3/edit

或者,如果你想觀看isLoaded和重新填充的計算性能,它看起來會更加清晰:

windowsByCreatedAt: function() { 
    return this.get('windows').sortBy('createdAt'); 
    }.property('[email protected]', 'windows.isLoaded') 

http://emberjs.jsbin.com/quyawitu/6/edit

+0

我用了一個jsbin模板,它必須有更多的過時的話,我以爲 - 感謝固定的! 我覺得'windowsByCreatedAt'函數對我來說仍然感覺有點笨拙。在數組代理上使用可排序的mixin並沒有太大的區別 - 這裏有一個jsbin:http://emberjs.jsbin.com/quyawitu/5/edit。我可能只是假設在這個問題沒有時應該有一個完美的,漂亮的解決方案。 – myowz

+1

由於窗口在特定情況下需要異步,所以它大多笨重,我會拋棄等待異步更新的懶惰方法。 – Kingpin2k

+1

我把它稱爲懶惰的唯一原因是因爲我更喜歡使用承諾,但它仍然有效,並且不會崩潰這種情況(firstWindow暫時未定義,但對模板沒有問題) – Kingpin2k