当你没有可依赖的阵列控制器时,我试图找出“Ember方式”进行排序。
我创建了一个jsbin来解释这种情况,虽然我无法在jsbin上运行它(尽管它在我的项目中有效):http://emberjs.jsbin.com/mused/2/edit?html,js
FIX - 感谢主销,这个jsbin工作正常:http://emberjs.jsbin.com/quyawitu/5/edit
基本上,假设您有两个模型:“House”和“Window”
房子里有很多窗户。窗户属于房子。
现在说你的模板看起来像这样:
<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>
在这个模板中,我对链接到Windows的关联不感兴趣 - 相反,我正在寻找第一个窗口(特别是第一个窗口,按createdAt排序)。
使用this question的答案,我使用带有可排序mixin的ArrayProxy在我的House模型上创建计算属性以获得此引用。我想知道是否有更惯用的“Ember方式”来做到这一点。
答案 0 :(得分:1)
升级ember并使用内置的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('windows.@each.createdAt')
});
http://emberjs.jsbin.com/quyawitu/3/edit
或者如果您想观看isLoaded
并重新填充计算属性,它看起来会更清晰:
windowsByCreatedAt: function() {
return this.get('windows').sortBy('createdAt');
}.property('windows.@each.createdAt', 'windows.isLoaded')