Promises和依赖计算属性的交集

时间:2013-12-30 16:20:25

标签: ember.js

我有一个有两个关系的用户模型(myFriends和friendsWithMe)。交集是代表真正朋友的用户数组。我用RSVP.all解决了这个计算:

friends: function() {
    var ret = [];
    Ember.RSVP.all([this.get('myFriends'), this.get('friendsWithMe')]).then(function(results) {
        ret.pushObjects(_.intersection(results[0].get('content'), results[1].get('content'))) ;
    });
    return ret;
}.property('myFriends.@each', 'friendsWithMe.@each'),

问题是现在我有另一个依赖于这个的计算属性:

/**
 *  Gives the relation between two User
 *  4: has requested your friendship
 *  3: Yourself
 *  2: Friends
 *  1: FriendShip Request
 */
myFriendshipStatus: function() {
if(this.get('friends').contains(this.container.lookup('user:current'))){
    return 2;
} else if(this.get('friendsWithMe').contains(this.container.lookup('user:current'))){
    return 4;
} else if(this.get('myFriends').contains(this.container.lookup('user:current'))){
    return 1;
} else if (this.get('id') === this.container.lookup('user:current').get('id')){
    return 3;
} else {
    return 0;
}
}.property('friends.@each')

当我现在调试myFriendShipStatus时,承诺未解析且“friends”数组还没有条目。

我还尝试将我的朋友功能更改为ember.computed.intersect,它将如下所示:

friends: function() {
    return Ember.computed.intersect('myFriends', 'friendsWithMe')
}.property('myFriends.@each', 'friendsWithMe.@each'),

但是我从这一行得到了一个例外:

  

如果(this.get( '朋友')包含(this.container.lookup( '用户:当前'))){

因为ArrayComputedProperty没有包含函数。

如何让我的朋友与myFriendShipStatus一起工作?我更喜欢使用Ember.computed.intersect,但我不知道如何检查它的值。

1 个答案:

答案 0 :(得分:0)

在第一个示例中返回空数组的原因如下。在Ember.RSVP.all()调用之后,将立即执行return语句,返回一个空的 ret 数组。在未来的某个时候,RSVP承诺将实现,但由于friends函数已经返回空数组,这将无效。

以下是您可以做的事情:

// See http://emberjs.com/api/#method_A
friends: Ember.A,

recalculateFriends: function() {
  Ember.RSVP.all([this.get('myFriends'), this.get('friendsWithMe')]).then(function(results) {
    var myFriends = results[0], friendsWithMe = results[1];
    this.set('friends', _.intersection(myFriends.get('content'), friendsWithMe.get('content')));
  });
}.property('myFriends', 'friendsWithMe'), // @each is redundant here

myFriendshipStatus: function() {
  // Will be recalculated when the friends array changes (which will in turn recalculate when myFriends or friendsWithMe changes
}.property('friends'),

而且......我现在才注意到你正在使用Ember.computed.intersect错误:P它不应该包含在函数中:

friends: Ember.computed.intersect('myFriends', 'friendsWithMe')

(参见示例:http://emberjs.com/api/#method_computed_intersect),