backbone.js设置模型数组属性
我有一个数组作为属性的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
什么是适当的语法来获取/设置数组属性? 谢谢。
您正在尝试的语法不起作用,因为发送到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中使用它(因为它现在是一个完全不同的对象)。