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 

什么是适当的语法来获取/设置数组属性? 谢谢。

您正在尝试的语法不起作用,因为发送到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方法。 所以,如果你需要这些事件,你必须自己开火,就像我所说的那样。

除了一件事之外,Derick的回答大多是正确的。 获取并设置数组属性不会在模型上生成更改事件。

get调用为您提供了对“myArray”属性中的数组的引用,然后您可以对其进行修改。 因为你有一个对象的引用,所以你直接修改和你的模型相同的数组。 当你调用“set”时,你传递的对象与该属性的数组完全相同 (因为它们都是对同一个对象的引用),并且没有检测到更改,因为set操作没有改变。

要触发更改事件,您仍然必须手动调用它(如在Derick的第二个示例中),或者创build数组的克隆并在您的setter中使用它(因为它现在是一个完全不同的对象)。