Ember计算了动态属性路径



Ember CLI+Ember 2.1

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

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

这些对象是从Ember数据中检索到的记录。是否需要对象是一个仅与组件相关的瞬态属性,这就是为什么我不在对象本身上使用"required"属性的原因。

有几个子组件使用不同的数据可视化显示这些对象中的一个或多个,每个子组件都有另一个子组件,该子组件具有用于要求该对象的控件。

控件本身将操作发送到父控制器,并从父控制器接收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;
    }
}),

然而,这并不奏效。本质上,我需要观察requiredList中与player.id匹配的键何时更新,但在初始化组件并设置"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;
        }
    }));
},

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

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

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

最新更新