valueBinding到数组的内容

时间:2011-06-16 16:17:37

标签: javascript sproutcore sproutcore-controllers

我有一个值的控制器。

App.xcontroller = SC.ArrayController.create({
   ...some code...
   array_values = [],
   ..more code...
})

现在我在某个视图中有一个这个valueBinding

valueBinding: 'App.xController.array_values',

当我更改数组中的值时,视图不会更新。但是当我这样做的时候 控制器中的以下内容:

var array_values = this.get('array_values');
...  adding / removing values to the array....  
  if (x_values.contains(x)){
    x_values.removeObject(x)
} else {
    x_values.pushObject(x);
};       
this.set('array_values', array_values.copy());

绑定有效,视图会更新。但只有副本()。 我不想复制数组,恕我直言这不高效。我只想 让valueBinding知道内容已经改变了..

x值只是一堆整数。

我想要这个的原因:我想更改SegmentedItemView的值键。我想更改活动按钮。但我不知道我有多少分段视图 所以我想我将每个生成的分段视图的值绑定到一些常见的数组,并更改该公共数组,以便能够更改所有分段视图上的活动按钮。由于每个按钮代表一个具有唯一键的项目,因此工作正常。除了我每次都必须复制数组。

1 个答案:

答案 0 :(得分:1)

  1. 设置content
  2. xcontroller属性
  3. 绑定到arrangedObjects
  4. xcontroller属性
  5. 您需要在阵列上使用符合KVO的方法来触发绑定。 ArrayController本身有addObjectremoveObject方法。 SC中的数组已经使用pushObject方法(以及其他方法)进行了扩充,这也符合KVO标准。因此,如果您使用KVO方法,视图应该更新。
  6. 您的视图未更新的原因是您绑定到数组,但数组本身没有更改。当您执行复制时,阵列本身会更改,因此绑定会触发。

    您可能还想尝试

    this.notifyPropertyChange('x_values');

    进行更改后,在控制器中

    ,但这不如使用内置KVO功能更好。