手动设置后,计​​算属性不再观察到更改

时间:2015-06-30 02:35:16

标签: ember.js

这里是jsbin http://emberjs.jsbin.com/wumufifasu/edit?html,js,output输入,可以输入项目的ID,其文本将显示在附近。 但是有两个项目具有相同的“id”属性,因此要显示正确的文本,可以从底部的列表中选择它们。

使用“手动选择”itemId只更改一次 - 第一次,之后没有设置,随后不会触发观察itemId的“itemText”CP。

奇怪的是,这种效果是由“itemText”CP的设置值引起的,而this.setProperties({'itemId': item.id, 'itemText': item.text});替换为this.setProperties('itemId', item.id);时不会发生 为什么?

2 个答案:

答案 0 :(得分:1)

属性既不能是计算属性,也不能是您设置的属性。如果设置什么是计算属性,则设置的值会破坏计算属性定义。该属性成为一个简单的价值。您必须决定:您是否希望Ember计算属性,您想自己设置吗?

(实际上,有一个设置计算属性的概念。但它需要以特殊方式编写计算属性定义。这里不需要。如果您对此功能感兴趣,请参阅http://guides.emberjs.com/v1.10.0/object-model/computed-properties/#toc_setting-computed-properties )。

问题是,您使用重复的ID - 不是一个好主意。当用户单击其中一个项目时,您将项目本身作为参数传递给操作,但是从项目的ID传递,因为存在重复的ID,在控制器操作中您无法再找到正确的方法ID中的项目。我建议在循环中添加index参数,然后将其作为动作参数传递回来。

顺便说一下,为什么要在组件中定义items?它复制了用作模型的items。您应该将模型传递给组件。

请参阅http://emberjs.jsbin.com/likazerune/1/edit?html,js,output

答案 1 :(得分:1)

for ember 2/3您可以直接使用getset方法保存计算:

     ...

     yourProperty: computed('propertyForComputation', {
         get(key) {
          // logic here
         },
         set(key, value) {
          // logic here
         },
     }), 

     ...