1

假设我有一个 hasMany 关系 Procedure => hasMany Steps,带有 async:true,并且我有一个名为 procedure-main 的过程组件(在过程路由上),它列出了如下步骤:

{{#each steps as |step| }}
 {{step.title}}
{{/each}}

我需要在任何步骤上更改 stepStatus 时观察每个步骤的属性(例如 stepStatus)。在 Ember 1.7 中,我在过程控制器上有这样的东西:

stepsStatusObserver: function(){
...
}.observes('steps.@each.stepStatus')

这是在任何步骤上的 stepStatus 更改时触发的,并且每当状态更改时,我在此函数中所拥有的任何内容都会被触发。但是,在 Ember 2.3 中,我无法实现这一点。我试过了

stepsStatusObserver: Ember.observer('steps.[].stepStatus', function(){
...
})

但这只会在页面上列出步骤时触发一次。当我将一个步骤的状态更改为新值时,该函数永远不会被触发。

如何在 Ember 2.3 中复制此功能?

注意:在我的用例中,我不能依靠单击按钮手动设置观察者内部的功能,因为如果在任何步骤上更改了 stepStatus 属性,它必须自动触发。

4

2 回答 2

15

问题是它steps.[].stepStatus不再是有效的依赖键。您应该将其替换为steps.@each.stepStatus.

以下是当前 Ember 版本中有效和无效依赖键的摘要:

  • array- 这会观察数组引用本身是否发生变化,例如用另一个值或数组替换整个数组,例如 that oldValue !== newValue
  • array.[]- 当数组本身发生变化时(上图)和数组长度发生变化时(功能上等效于array.length) ,这都会观察到
  • array.@each.property- 观察上述两种情况以及property数组的某些项目何时发生变化
  • array.@each.{prop,anotherProp}- 您还可以在仅指定一个键的同时观察多个属性。这扩展为array.@each.proparray.@each.anotherProp
  • array.@each- 不再有效,没有尾随@each. 改为使用.[]
  • array.@each.property.property- 也无效。请注意,@each这只适用于一层深度。您不能使用嵌套形式,如todos.@each.owner.nameor todos.@each.owner.@each.name
  • array.[].property- 不再有效。改用@each表格。
于 2016-02-29T10:44:36.347 回答
0

你仍然应该使用@each

stepsStatusObserver: Ember.observer('steps.@each.stepStatus', function(){
...
})
于 2016-02-29T00:02:27.123 回答