valueBinding к содержимому массива - PullRequest
0 голосов
/ 16 июня 2011

У меня есть этот контроллер со значением.

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

Теперь у меня есть где-то в представлении это значениеBinding

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 Ответ

1 голос
/ 16 июня 2011
  1. установить content свойство xcontroller
  2. Привязка к arrangedObjects свойству xcontroller
  3. Вам нужно использовать методы, совместимые с KVO в массиве, чтобы сработали привязки. Сам ArrayController имеет методы addObject и removeObject. Массивы в SC были дополнены методом pushObject (среди прочего), который также является совместимым с KVO. Поэтому, если вы используете методы KVO, представление должно обновиться.

Причина, по которой ваше представление не обновляется, заключается в том, что вы привязаны к массиву, но сам массив не изменился. Когда вы делаете копию, сам массив изменяется, поэтому привязки срабатывают.

Вы также можете попробовать

this.notifyPropertyChange('x_values');

в контроллере после внесения изменений, но это менее предпочтительно, чем использование встроенной функциональности KVO.

...