2

次のようなモデルがあるとします。

App.Document = DS.Model.extend
  users: DS.hasMany('App.User')
  contacts: DS.hasMany('App.Contact')

次のように 2 つの hasMany 関係を結合する計算されたプロパティを作成する最良の方法は何ですか?

people: ( ->
  users.toArray().concat(contacts.toArray()).sort (a, b) ->
    Em.Compare(a.get('name'), b.get('name'))
).property('users.[]', 'contacts.[]')

ソートを適用し、レコード配列が空の場合に考慮に入れる、上記の大まかな推測よりも良い方法はありますか?

4

2 に答える 2

0

これがあなたが探しているものかどうかはわかりませんが、property('users.@each')代わりに使用して(小文字で)にproperty('users.[]')変更する必要があると思いますEm.Compare...Em.compare...

のモデルを持つことを説明するサンプルを作成しましUserContactDocument

ドキュメントの 1 つには連絡先が関連付けられておらず、1 つには連絡先もユーザーも関連付けられていません。計算されたプロパティは次のpeopleようになります。

people: ( ->
  @get('users').toArray().concat(@get('contacts').toArray()).sort (a, b) ->
    Ember.compare(a.get('fullName'), b.get('fullName'))
).property('users.@each', 'contacts.@each')

並べ替えは、結合された配列でうまく機能します。

注: 私はコーヒーがあまり上手ではありません。構文が 100% 正しくない場合は申し訳ありません

于 2013-04-22T20:46:09.980 に答える
0

これは関連するソリューションです: https://stackoverflow.com/a/15869936/844923

JSBin の例

特殊キーを使用するだけで、思い通りのことができます@each

リンクされた例の例:

stream: function() {
  var post = this.get('post'),
      bookmark = this.get('bookmark'),
      photo = this.get('photo');

  var stream = [];

  stream.pushObjects(post);
  stream.pushObjects(bookmark);
  stream.pushObjects(photo);
  return stream;
}.property('post.@each', 'bookmark.@each', 'photo.@each'),

そして、それらを並べ替えます:

 streamSorted: function() {
    var streamCopy = this.get('stream').slice(); // copy so the original doesn't change when sorting
    return streamCopy.sort(function(a,b){
      return a.get('publishtime') - b.get('publishtime');
    });
  }.property('stream.@each.publishtime')
于 2013-04-22T20:46:43.390 に答える