控制器如何观察其自身的价值?

时间:2013-07-26 14:22:07

标签: ember.js

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

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

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

这是一个JSBin。打开控制台+单击链接,您将看到控制器属性发生更改,但hi仅触发一次。

3 个答案:

答案 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')

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