用setter和getter计算的bug ember

时间:2017-01-23 17:45:45

标签: ember.js

如此。我在我的component.js中有这个:

…
inputs: Ember.A(),

inputGroup: computed('inputs.[]', {
    get() {
      return this.get('inputs').mapBy('value');
    },
    set(_, values) {
     # breakpoint 1
      if (values) {
        values.forEach(value => {
          this.get('inputs').addObject({ id: Symbol(), value: value });
        });
      }
     # breakpoint 2
      return this.get('inputs').mapBy('value');
    },
  }),
...

我的app.hbs中有2个这个组件:

{{addon-component inputGroup=firstGroup … }} {{addon-component inputGroup=secondGroup … }}

使用app.js:

…
firstGroup: Ember.A([’text@text.com’]),
secondGroup: Ember.A(),
…

在我的第一个组件中,# breakpoint 1inputs === []# breakpoint 2inputs === ['test@test.com']上的调试器 在我的第二个,# breakpoint 1上的调试器,已经inputs === [‘text@text.com’]。 怎么可能?

1 个答案:

答案 0 :(得分:2)

您不应该直接在组件上声明数组或对象。以这种方式声明的数组或对象在组件实例之间共享。您需要在init钩子中声明它们,这样它们将为每个组件实例设置独立。所以你需要以这种方式声明输入。

//inside component
init() {
  this._super(...arguments);
  this.set('inputs', Ember.A());
}

来自the guide

  

直接在任何Ember.Object上定义的数组和对象是共享的   跨越该对象的所有实例。