2

私は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')
        });
      }),
    });
   }
 });

}、

そしてルートモデルを利用したhtmlバー。私の計算されたプロパティは、リロード時に常に正しく呼び出されますが、次のように友人と profile.friends レコードを追加してストアを変更するユーザー アクション 'Add Friend' では更新されません。

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 をデバッグしたところ、プロパティ変更通知の無効化コードが呼び出されていることがわかりました。これはコードの選択にすぎません...

何が足りないの...? これにアプローチするより良い方法はありますか?

4

1 に答える 1

0

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()Ember.Routeでの使用です。

于 2015-09-26T13:19:52.673 に答える