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 ответ
- установить
content
собственностьxcontroller
- Привязать к
arrangedObjects
собственностьxcontroller
- Вы должны использовать KVO-совместимые методы в массиве для запуска привязок. Сам ArrayController имеет
addObject
а такжеremoveObject
методы. Массивы в SC были дополненыpushObject
метод (среди прочего), который также соответствует КВО. Поэтому, если вы используете методы KVO, представление должно обновиться.
Причина, по которой ваше представление не обновляется, заключается в том, что вы привязаны к массиву, но сам массив не изменился. Когда вы делаете копию, сам массив изменяется, поэтому привязки срабатывают.
Вы также можете попробовать
this.notifyPropertyChange('x_values');
в контроллере после внесения изменений, но это менее предпочтительно, чем использование встроенной функциональности KVO.