【问题标题】:Why does my Ember computed property on hasMany relationship not update?为什么我在 hasMany 关系上的 Ember 计算属性没有更新?
【发布时间】:2015-09-26 13:17:15
【问题描述】:

我有一个 Ember Data 模型:

export default DS.Model.extend({
  name: DS.attr('string'),
  friends: DS.hasMany('friend',{async:true}),
  requestedFriendIds: Ember.computed('friends',function(){
    return this.get('friends').then(function(friends){
      return friends.filterBy('status','Requested').mapBy('id');
    });
  })
 });

我有一个使用它的路线设置:

export default Ember.Route.extend({
  model: function(params){
    return Ember.RSVP.hash({
      memberProfile:this.store.find('member-profile', params.memberprofile_id).then(function(memberProfile)
      {
        return Ember.RSVP.hash({
          requestedFriendIds:memberProfile.get('requestedFriendIds'),
          UserId:memberProfile.get('user.id'),
          Id:memberProfile.get('id')
        });
      }),
    });
   }
 });

},

还有利用路由模型的 htmlbars。我的计算属性总是在重新加载时正确调用,但不会在用户操作“添加朋友”时刷新,这会通过添加朋友和 profile.friends 记录来更改商店,如下所示:

actions:
{
  addFriend:function(profile_id,)
  {
    this.store.findRecord('member-profile',memberProfile).then(function(member){
      var friend = this.store.createRecord('friend',
      {
        member:member,
        status:'Requested',
        timestamp: new Date(),
      });
      friend.save();
      member.get('friends').pushObject(friend);
      member.save();
  }.bind(this));
}

}

一些注意事项:我已经尝试过 'friends'、'friends.[]' 上的计算属性。我的代码库是 Ember 2.0.1,带有 Ember.Data 1.13.12,因此不推荐使用“friends.@each”。底层数据在后备存储 (EmberFire) 中正确更新。我已经调试到 EmberData,我看到调用了属性更改通知无效代码。这只是部分代码...

我错过了什么……?有没有更好的方法来解决这个问题?

【问题讨论】:

  • 相信你想在CP上看friends.@each
  • @each 在 Ember 2.* 中已弃用。我会更新我的问题。
  • 只看friends.@each 不是它的设计目的。当然应该是friends.[]
  • 请再次检查我的回答。我添加了另一种可能的解决方案。

标签: ember.js emberfire


【解决方案1】:

我认为你应该看friends.[] 而不仅仅是friends

requestedFriendIds: Ember.computed('friends.[]',function(){
    return this.get('friends').then(function(friends){
      return friends.filterBy('status','Requested').mapBy('id');
    });
  })

您可能会将您的操作放在您的路线中并手动刷新模型(这可能是承诺结果未绑定到 CP 更改的问题)。所以,在你的路线上:

actions: {
  addFriend(profile_id) {
    this.store.findRecord('member-profile', memberProfile).then(member => {
      let friend = this.store.createRecord('friend',
      {
        member:member,
        status:'Requested',
        timestamp: new Date()
      });
      friend.save();
      member.get('friends').pushObject(friend);
      member.save();

      this.refresh();
    });
  }
}

最重要的部分是使用this.refresh() in Ember.Route

【讨论】:

  • 请再次检查我的回答。我添加了另一种可能的解决方案。
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2020-05-09
  • 2014-12-21
  • 1970-01-01
  • 2014-03-01
  • 2017-07-08
相关资源
最近更新 更多