【问题标题】:Sorting a hasMany relationship without an ArrayController在没有 ArrayController 的情况下对 hasMany 关系进行排序
【发布时间】:2014-07-28 00:55:03
【问题描述】:

当您没有可依赖的数组控制器时,我正在尝试找出“Ember 方式”进行排序。

我创建了一个 jsbin 来解释这种情况,虽然我无法让它在 jsbin 上工作(尽管它在我的项目中工作):http://emberjs.jsbin.com/mused/2/edit?html,js

FIX -- 感谢 kingpin,这个 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>

在这个模板中,我不只对链接到窗口的关联感兴趣——相反,我正在寻找第一个窗口(特别是第一个窗口,按 createdAt 排序)。

使用this question 的答案,我使用带有可排序mixin 的ArrayProxy 在我的House 模型上创建计算属性以获取此参考。我想知道是否有更惯用的“Ember 方式”来做到这一点。

【问题讨论】:

    标签: javascript sorting ember.js ember-data


    【解决方案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

    【讨论】:

    • 我使用了一个 jsbin 模板,它一定比我想的更过时了——感谢您修复它!我觉得“windowsByCreatedAt”功能对我来说仍然有点笨拙。在数组代理上使用可排序的 mixin 并没有太大的不同——这里有一个 jsbin:emberjs.jsbin.com/quyawitu/5/edit。我可能只是假设应该有一个完美、漂亮的解决方案来解决这个问题。
    • 由于在这种特殊情况下窗口需要异步,这主要是笨拙的,我将放弃等待异步更新的懒惰方法。
    • 我称之为惰性的唯一原因是因为我更喜欢使用承诺,但它仍然有效并且不会在这种情况下崩溃(firstWindow 暂时未定义,但模板没有问题)
    • 对,我明白了。看起来确实很棒。 sortBy 是否有升序或降序标志?
    • 不,我认为一些 PR 正在为此浮动,它的默认实现允许一次发送多个项目,但不允许 asc/desc。在单一排序的情况下,反向是合理的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2011-04-12
    • 2012-05-16
    • 2023-03-20
    相关资源
    最近更新 更多