Свойство backbone.js set array array
У меня есть модель backbone.js с массивом как свойство:
defaults: {
myArray : [0,1,2]
}
Я пытаюсь установить значение для определенного индекса.
var myIndex = 1;
myModel.set({"myArray"[myIndex] : newVal}); //doesn't work
myModel.set({"myArray[myIndex]": newVal}); //doesn't work
myModel.set({"myArray" + "[" + myIndex + "]": newVal}); //doesn't work
Каков правильный синтаксис для получения/установки свойств массива? Спасибо.
Ответы
Ответ 1
Синтаксис, который вы пытаетесь выполнить, не работает, потому что параметры, отправленные в метод set, являются объектным литералом. значения в левой части: обрабатываются как буквальные имена, а значения справа могут быть выполнены/интерпретированы.
Есть несколько вещей, которые вы можете сделать:
получить, обновить и установить весь массив:
var a = myModel.get("myArray");
a[0] = 5
myModel.set("myArray", a);
myModel.get("myArray"); //=> [5, 1, 2]
Преимущество при этом заключается в том, что вы получаете стандартные "изменения" событий, выпущенных из модели, потому что вы устанавливаете значение атрибута для модели.
Другой способ сделать это - это сократить процесс с помощью get и непосредственно обновить массив:
myModel.get("myArray")[0] = 5
myModel.trigger("change");
myModel.trigger("change:myArray");
myModel.get("myArray"); //=> [5, 1, 2]
Недостаток заключается в том, что это не вызовет события "изменения", потому что вы не вызываете метод set. поэтому, если вам нужны эти события, вы должны сами их запускать, как я показал.
Ответ 2
Ответ Derick в основном правилен, кроме одной вещи. Получение и последующее установление свойства массива не будут генерировать события изменения в модели.
Вызов get дает ссылку на массив в свойстве "myArray", который вы затем изменяете. Поскольку у вас есть ссылка на объект, вы непосредственно изменяете тот же массив, что и на вашей модели. Когда вы вызываете "set", объект, который вы передаете, в точности равен массиву для этого свойства (потому что они оба являются ссылками на один и тот же объект), и никаких изменений не обнаружено, потому что нет изменений в заданной операции.
Чтобы инициировать событие изменения, вам все равно придется называть его вручную (как во втором примере Derick), или создать клон массива и использовать его в своем сеттере (так как теперь это совершенно другой объект).