【问题标题】:Ember.js order hasMany childrenEmber.js 订单 hasMany Children
【发布时间】:2012-08-01 20:55:26
【问题描述】:

我有一个项目模型,每个项目可以有很多项目。这可能有很多层次。

我有这个 jsfiddle http://jsfiddle.net/rmossuk/xmcBf/3/

我如何更改它以拥有多个级别的项目,以及如何循环每个级别以显示它们?

我还需要能够订购每个子项目并将该订单存储到服务器。

谁能告诉我你是怎么做到的?

更新:

我现在已经设法实现了 Items can be many levels deep bit of this problem see here http://jsfiddle.net/rmossuk/fBmmS/3/

但我需要一种方法来说明每个子项的顺序并按该顺序显示它们。目前它只显示 itemIds 数组中的子项,但这仅用于关联目的,我无法将其更改为重新排序,可以吗??

有人知道怎么做吗?

非常感谢 瑞克

【问题讨论】:

  • 如果您已经解决了这个问题,您介意发布解决方案吗。
  • 我还没解决呢!仍在尝试 !希望有人能尽快帮助我。
  • 我已经看到 Ember.ArrayController 有一个 sortProperties 但似乎无法解决如何为每个项目添加一个 ArrayController 来存储每个项目的子订单。希望有人能尽快提供帮助
  • 我来了!希望我能帮助... :-)

标签: javascript ember.js ember-data


【解决方案1】:

在视图中,使用sortedItems 计算属性,定义如下:

JS

App.Item = DS.Model.extend({
  name: DS.attr('string'),
  index: DS.attr('number'),
  items: DS.hasMany('App.Item', {key: 'itemIds'} ),
  item: DS.belongsTo('App.Item'),
  product: DS.belongsTo('App.Product'),

  sortedItems: function () {
    var items = this.get('items').toArray();
    return items.sort(function (lhs, rhs) {
      return lhs.get('index') - rhs.get('index');
    });
  }.property('items.@each.isLoaded')
});

在此处查看完整的工作解决方案:http://jsfiddle.net/MikeAski/K286Q/3/


编辑

根据您的要求,这是另一种解决方案,将排序后的 id 保留在父级中(以最大程度地减少更新和索引管理):http://jsfiddle.net/MikeAski/K286Q/12/

JS

App.Item = DS.Model.extend({
  name: DS.attr('string'),
  items: DS.hasMany('App.Item', {key: 'itemIds'} ),
  sortedIds: DS.attr('string', { key: 'sortedIds' }),
  item: DS.belongsTo('App.Item'),
  product: DS.belongsTo('App.Product'),

  sortedChildren: function () {
    if (!this.get('isLoaded')) {
      return [];
    }
    var sortedIds = this.get('sortedIds').split(','),
        items = this.get('items').toArray();
    return sortedIds.map(function (id) {
      if (id === '') {
        return null;
      }
      return items.find(function (item) {
          return item.get('id') == id;
      });
    }).filter(function(item) {
      return !!item;
    });
  }.property('isLoaded', 'sortedIds', 'items.@each.isLoaded')
});

有点复杂,不过……

【讨论】:

  • 感谢 mike 的回答已经尝试排序这几天了!!有没有办法通过将订单存储在父项上来做到这一点,而不必在每个项目上存储索引?尝试这样做是因为如果我使用此解决方案更改订单或项目,那么我必须更改每个子项目上的所有索引并将所有这些更改保留到服务器。好像我可以将孩子的实际顺序存储在父母身上,当我更改其任何孩子的顺序时,我只需要保存并坚持父母。希望这是有道理的??有任何想法吗 ??非常感谢
  • 嘿,迈克太棒了,非常感谢,我真的很感激。我欠你一个!
  • 不客气。感谢接受。你考虑过投票吗? ;-)
  • 对我来说 .toArray() 的使用真的很有趣。没有文档告诉如何让 hasMany 关系回到您可以实际使用的格式。谢谢你和+1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 2016-06-11
相关资源
最近更新 更多