ember.js - 计算属性combine 2 hasMany

时间:2013-04-22 19:07:00

标签: ember.js

说我有这样的模型:

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.[]')

是否有比上述粗略猜测更好的方法应用排序并考虑记录数组是否为空?

2 个答案:

答案 0 :(得分:0)

不确定这是否是您要找的,但我认为您必须使用property('users.@each')代替property('users.[]')并将Em.Compare...更改为Em.compare...(在较低级别)情况下)

我制作了sample来说明UserContactDocument

的模型

其中一个文档没有与之关联的联系人,一个文档既没有联系人也没有用户。 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%正确

答案 1 :(得分:0)

这是一个相关的解决方案:https://stackoverflow.com/a/15869936/844923

JSBin example

只需使用特殊的@each key

,您就可以完全按照自己的想法行事

链接示例中的示例:

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')