2

假设我有这样的模型:

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

创建将两个 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...(小写)

我制作了一个示例来说明为User,ContactDocument

其中一个文档没有与之关联的联系人,而一个文档既没有联系人也没有用户。计算的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 回答