backbone.js设置模型数组属性

时间:2011-09-06 19:21:01

标签: backbone.js

我有一个使用数组作为属性的bac​​kbone.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

获取/设置数组属性的正确语法是什么?感谢。

2 个答案:

答案 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中使用它(因为它现在是一个完全不同的对象)。