【问题标题】:ember data computed property not working on nested associationember 数据计算属性不适用于嵌套关联
【发布时间】:2024-01-15 18:57:01
【问题描述】:

我有一个简单的数据模型:

一条腿,有很多玩家,有很多回合:

App.Store = DS.Store.extend({
  revision: 11,
  adapter: 'DS.FixtureAdapter'
});

App.Leg = DS.Model.extend({
  players: DS.hasMany('App.Player'),
  turnCount: function() {
    var i = 0;
    this.get('players').forEach(function(p) {
      i+= p.get('turns.length');
    });
    return i;
  }.property('players.@each.turns.length')

});

App.Player = DS.Model.extend({
  leg: DS.belongsTo('App.Leg'),
  turns: DS.hasMany('App.Turn')
});


App.Turn = DS.Model.extend({
  player: DS.belongsTo('App.Player')
});

当我创建一个新回合时,计算属性 turnCount 不会自动更新,但它应该,对吧?

/*
* do this on the console to verify
*/

var leg = App.Leg.createRecord();
var player = leg.get('players').createRecord();

leg.get('turnCount');
// => 0
player.get('turns').createRecord();
leg.get('turnCount')
// => 0

更新

似乎如果你坚持一层嵌套的东西就行了。所以:

.property('players.@each.someProperty') 

只要 someProperty 不是 Enumerable 就可以工作。

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    试试这个:

    .property('players.@each.turns.@each')
    

    您也可以使用reduce 方法计算总数:

    turnCount: function() {
      return this.get('players').reduce(function(value, player) {
        return value + player.get('turns.length');
      }, 0);
    }.property('players.@each.turns.@each')
    

    【讨论】: