在没有ArrayController的情况下对hasMany关系进行排序

时间:2014-06-06 17:02:07

标签: javascript sorting ember.js ember-data

当你没有可依赖的阵列控制器时,我试图找出“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方式”来做到这一点。

1 个答案:

答案 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')

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