说我有这样的模型:
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.[]')
是否有比上述粗略猜测更好的方法应用排序并考虑记录数组是否为空?
答案 0 :(得分:0)
不确定这是否是您要找的,但我认为您必须使用property('users.@each')
代替property('users.[]')
并将Em.Compare...
更改为Em.compare...
(在较低级别)情况下)
我制作了sample来说明User
,Contact
和Document
其中一个文档没有与之关联的联系人,一个文档既没有联系人也没有用户。 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
只需使用特殊的@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')