1

我无法让我的 ApplicationController 观察其值之一。视图正在调用控制器上的函数,该函数会更改其selectedIds属性。控制器上的另一种方法观察到这一点:

hi: function() {
  console.log('hi');
}.observes('selectedIds')

但只是第一次被调用。这是指定观察者的正确方法吗?

这是一个JSBin。打开控制台+点击链接,你会看到控制器属性发生了变化,但hi只触发了一次。

4

3 回答 3

2

问题更多在于观察 Ember 数组,而不是观察控制器自身的值。

观察者正在观察属性。因此,当您只是将某些内容推入数组时,属性(该数组)不会改变。

首先,您需要使用 Ember 的 pushObject 方法将数组中的元素视为 Ember 对象:

allIds.pushObject(id); // not allIds.push(id)

然后观察者应该使用@each 观察数组的每个元素,而不是观察数组本身。

hi: function() {
    console.log('hi');
}.observes('selectedIds.@each')

更新 JSBin:http: //jsbin.com/aqagij/2/edit

我希望这会有所帮助。

于 2013-07-26T15:02:52.950 回答
1

这是指定观察者的正确方法吗?

不,请改用 `.observes('selectedIds.@each') 。

只有 .observes('selectedIds') 观察者只会在 selectedIds 更改时被调用。因此,当您第一次单击链接时, selectedIds 会从 null 更改为具有一个元素的数组,并且会触发观察者。

请参阅http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/

于 2013-07-26T15:04:30.273 回答
1

这里的问题是 selectedIds 是一个普通对象的普通数组。Ember 不知道添加了一个项目。这两个选项是,在您执行任何添加或删除操作后手动提醒发生了更改,或者通过使用其数组对象让 Ember“自动”知道。

或者手动通知 Ember 并观察整个数组:

 this.notifyPropertyChange('selectedIds')
 .observes('selectedIds')

请参阅:http ://emberjs.com/api/classes/Ember.Array.html

于 2013-07-26T15:14:26.390 回答