Подтвердить что ты не робот

Свойство 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

Каков правильный синтаксис для получения/установки свойств массива? Спасибо.

4b9b3361

Ответ 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), или создать клон массива и использовать его в своем сеттере (так как теперь это совершенно другой объект).