Ember.js 手动设置后,计算属性不再观察更改

Ember.js 手动设置后,计算属性不再观察更改,ember.js,Ember.js,这里是带有输入的jsbin,在这里可以输入项目的id,其文本将显示在附近。 但是有两个项目具有相同的“id”属性,因此要显示正确的文本,可以从底部的列表中选择它们 使用“手动选择”时,itemId仅更改一次-第一次,之后未设置,随后观察itemId的“itemText”CP不会触发 奇怪的是,这种效果是由设置“itemText”CP的值引起的,当this.setProperties({'itemId':item.id,'itemText':item.text})时不会发生替换为this.setP

这里是带有输入的jsbin,在这里可以输入项目的id,其文本将显示在附近。 但是有两个项目具有相同的“id”属性,因此要显示正确的文本,可以从底部的列表中选择它们

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

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

为什么

属性不能既是计算属性又是您设置的属性。如果设置的是计算特性,则设置的值将破坏计算特性定义。属性成为一个简单的值。您必须决定:您想让Ember计算属性,还是自己设置属性

(实际上,有一个设置计算属性的概念。但是它需要以特殊的方式编写计算属性定义。这里不需要。如果您对此功能感兴趣,请参阅)

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

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


请参阅。

了解余烬
2/3
您可以通过usng
get
set
方法直接保留计算:

     ...

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

     ...

感谢您清除设置CP的细微差别。jsbin表示应用程序的简化模型,其中没有模型,并且是以另一种方式设计的,但我将在下一个项目中考虑到这一点。