Ember计算动态属性路径

时间:2015-11-13 01:46:28

标签: ember.js

Ember CLI + Ember 2.1

我有一个子组件,它在父组件上观察键/值哈希,跟踪“必需”对象。

requiredObjects: {
  object1_id: true,
  object2_id: false,
  ...
}

这些对象是从Ember-Data检索的记录。是否需要对象是仅与组件相关的瞬态属性,这就是我不在对象本身上使用“必需”属性的原因。

有几个子组件使用不同的数据可视化显示一个或多个这些对象,并且每个子组件都有另一个子组件,其中包含需要该对象的控件。

控件本身将动作发送到父控制器,并从父控制器接收requiredList。我想做的是......

isRequired: Ember.computed('player', `requiredList.${this.get('player.id')}`, {
    get(key) {
        return this.get(`requiredList.${this.get('player.id')}`);
    }, 
    set(key, value) {
        this.set(`requiredList.${this.get('player.id')}`, value);
        return value;
    }
}),

然而,这不起作用。基本上,我需要观察匹配player.id的requiredList中的键是否更新,但是在组件初始化并且设置了“player”之前我不知道id。有没有办法做到这一点?

我考虑过使用数组而不是键/值哈希,但这需要每次控件在每次成员身份更改时循环遍历数组并查看其播放器是否在requiredList中。这似乎效率很低,因为列表中通常有几百个玩家,每个玩家目前在页面的不同部分呈现2或3个控件。

更新

所以将它移动到init()可以解决问题,但我不知道为什么。

init() {
    this._super(...arguments);
    this.set('isRequired', Ember.computed('player', `requiredList.${this.get('player.id')}`, {
        get(key) {
            return this.get(`requiredList.${this.get('player.id')}`);
        }, 
        set(key, value) {
            this.set(`requiredList.${this.get('player.id')}`, value);
            return value;
        }
    }));
},

1 个答案:

答案 0 :(得分:0)

模板化字符串使用当前上下文进行评估。

在第一种情况下,上下文实际上是模块本身,其规格为undefined,因此requiredList.${this.get('player.id')} => requiredList.undefined

在第二种情况下,您位于init()函数内,因此this是对象。