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自体にはaddObjectandremoveObjectメソッドがあります。SCの配列は、pushObject(とりわけ)KVOに準拠したメソッドで拡張されています。したがって、KVOメソッドを使用すると、ビューが更新されます。

ビューが更新されない理由は、配列にバインドされているが、配列自体は変更されていないためです。コピーを実行すると、配列自体が変更されるため、バインディングが起動します。

あなたも試してみたいかもしれません

this.notifyPropertyChange('x_values');

変更を加えた後、コントローラーで。ただし、組み込みのKVO機能を使用するよりも好ましくありません。

于 2011-06-16T17:14:15.107 に答える