1

アイテムモデルがあり、各アイテムには多くのアイテムを含めることができます。これは、多くのレベルの深さになる可能性があります。

私はこのjsfiddle http://jsfiddle.net/rmossuk/xmcBf/3/を持っています

複数のレベルのアイテムを持つことができるようにこれを変更するにはどうすればよいですか?また、各レベルをループダウンして表示するにはどうすればよいですか?

また、各アイテムの子を注文し、その注文をサーバーに保持できるようにする必要があります。

これを行う方法を教えてください。

アップデート:

私は今、アイテムを実装することができました。この問題の多くのレベルの深いビットを実装することができます

しかし、各アイテムの子の順序を示し、その順序で表示する方法が必要です。現時点では、itemIds 配列から子アイテムを表示するだけですが、これは関連付けの目的でのみ使用され、これを変更して並べ替えることはできませんか??

誰でもこれを行う方法を知っていますか?

どうもありがとうリック

4

1 に答える 1

13

ビューでは、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')
});

もう少し複雑ですが...

于 2012-08-03T11:50:03.183 に答える