我有一个使用数组作为属性的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
获取/设置数组属性的正确语法是什么?感谢。
答案 0 :(得分:69)
您尝试的语法不起作用,因为发送到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方法。所以,如果你需要这些事件,你必须自己解雇,正如我所展示的那样。
答案 1 :(得分:58)
get调用为您提供了对“myArray”属性中数组的引用,然后您可以对其进行修改。因为您有对象的引用,所以您直接修改与模型相同的数组。然后当你调用“set”时,你传递的对象完全等于该属性的数组(因为它们都是对同一对象的引用),并且没有检测到任何变化,因为它有设置操作没有变化。
要触发更改事件,您仍然需要手动调用它(如在Derick的第二个示例中),或创建数组的克隆并在您的setter中使用它(因为它现在是一个完全不同的对象)。