valueBinding к содержимому массива

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

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

привязка работает, вид обновляется. Но ТОЛЬКО с копией (). Я не хочу делать копию массива, IMHO, это не эффективно. Я просто хочу, чтобы valueBinding знал, что содержание изменилось..

значения х это просто набор целых чисел.

Причина, по которой я хочу это: я хочу изменить ключ значения SegmentedItemView. Я хочу изменить активные кнопки. Но я не знаю заранее, сколько у меня есть сегментированных представлений, поэтому я решил связать значение каждого сгенерированного сегментированного представления с каким-либо общим массивом и изменить этот общий массив, чтобы иметь возможность изменять активные кнопки на всех сегментированных представлениях. Так как каждая кнопка представляет элемент с уникальным ключом, она работает нормально. кроме того, что я должен копировать массив каждый раз.

1 ответ

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

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

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

this.notifyPropertyChange('x_values');

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

Другие вопросы по тегам