我无法让我的ApplicationController观察其中一个值。视图正在调用控制器上的一个函数,该函数会更改其selectedIds
属性。控制器上的另一种方法是:
hi: function() {
console.log('hi');
}.observes('selectedIds')
但只是第一次被召唤。这是指定观察者的正确方法吗?
这是一个JSBin。打开控制台+单击链接,您将看到控制器属性发生更改,但hi
仅触发一次。
答案 0 :(得分:2)
问题更多的是观察Ember数组而不是观察控制器自身的值。
观察者正在观察属性。所以当你只是将某些东西推入数组时,属性(该数组)不会改变。
首先,您需要使用Ember的pushObject方法来处理数组中的元素,如Ember Objects:
allIds.pushObject(id); // not allIds.push(id)
然后观察者应该使用@each观察数组的每个元素,而不是观察数组本身。
hi: function() {
console.log('hi');
}.observes('selectedIds.@each')
更新了JSBin:http://jsbin.com/aqagij/2/edit
我希望有所帮助。
答案 1 :(得分:1)
这是指定观察者的正确方法吗?
不,请改用.observes('selectedIds。@ each')。
只有.observes('selectedIds')只有在selectedIds发生变化时才会调用观察者。因此,当您第一次单击链接时,selectedIds会从null更改为包含一个元素的数组,并且会触发观察者。
请参阅http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/
答案 2 :(得分:1)
这里的问题是selectedIds是普通对象的普通数组。 Ember不知道添加了一个项目。这两个选项是,在您执行任何添加或删除操作后手动警告更改发生,或者让Ember通过使用其数组对象自动“知道”。
或手动通知Ember,只需观察整个阵列:
this.notifyPropertyChange('selectedIds')
.observes('selectedIds')