0

我有这个具有价值的控制器。

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());

绑定有效,视图得到更新。但只能使用 copy()。我不想复制数组,恕我直言,这效率不高。我只是想让 valueBinding 知道内容已经改变..

x 值只是一堆整数。

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

4

1 回答 1

1
  1. 设置content属性xcontroller
  2. 绑定到arrangedObjects属性xcontroller
  3. 您需要在阵列上使用符合 KVO 的方法来触发绑定。ArrayController 本身有一个addObjectremoveObject方法。SC 中的数组已通过一种pushObject方法(以及其他方法)进行了扩充,该方法也符合 KVO。因此,如果您使用 KVO 方法,视图应该会更新。

你的视图没有更新的原因是你被绑定到了数组,但是数组本身并没有改变。当您进行复制时,数组本身会发生变化,因此绑定会触发。

您可能还想尝试

this.notifyPropertyChange('x_values');

在您进行更改后在控制器中,但这比使用内置的 KVO 功能更可取。

于 2011-06-16T17:14:15.107 回答