我无法让我的 ApplicationController 观察其值之一。视图正在调用控制器上的函数,该函数会更改其selectedIds
属性。控制器上的另一种方法观察到这一点:
hi: function() {
console.log('hi');
}.observes('selectedIds')
但只是第一次被调用。这是指定观察者的正确方法吗?
这是一个JSBin。打开控制台+点击链接,你会看到控制器属性发生了变化,但hi
只触发了一次。
问题更多在于观察 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
我希望这会有所帮助。
这是指定观察者的正确方法吗?
不,请改用 `.observes('selectedIds.@each') 。
只有 .observes('selectedIds') 观察者只会在 selectedIds 更改时被调用。因此,当您第一次单击链接时, selectedIds 会从 null 更改为具有一个元素的数组,并且会触发观察者。
请参阅http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/
这里的问题是 selectedIds 是一个普通对象的普通数组。Ember 不知道添加了一个项目。这两个选项是,在您执行任何添加或删除操作后手动提醒发生了更改,或者通过使用其数组对象让 Ember“自动”知道。
或者手动通知 Ember 并观察整个数组:
this.notifyPropertyChange('selectedIds')
.observes('selectedIds')