backbone.js设置模型数组属性

for*_*ice 38 backbone.js

我有一个使用数组作为属性的bac​​kbone.js模型:

defaults: {
    myArray : [0,1,2]
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试设置特定索引的值.

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
Run Code Online (Sandbox Code Playgroud)

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

Der*_*ley 69

您尝试的语法不起作用,因为发送到set方法的参数是对象文字.:左侧的值被视为文字名称,而右侧的值可以被执行/解释代码.

但是你可以做一些事情:

获取,更新和设置整个数组:

var a = myModel.get("myArray");
a[0] = 5
myModel.set("myArray", a);

myModel.get("myArray"); //=> [5, 1, 2]
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,您可以获得从模型中触发的标准"更改"事件,因为您要在模型上设置属性的值.

另一种方法是使用get来快速处理进程,并直接更新数组:

myModel.get("myArray")[0] = 5
myModel.trigger("change");
myModel.trigger("change:myArray");

myModel.get("myArray"); //=> [5, 1, 2]
Run Code Online (Sandbox Code Playgroud)

这里的缺点是,这不会触发"更改"事件,因为您没有调用set方法.所以,如果你需要这些事件,你必须自己解雇,正如我所展示的那样.

  • 第一种方法可能不会触发正确的`change`事件,如果修改发生在`set`动作之前,set将不会将旧值和新值视为不同. (3认同)

Ian*_*son 58

除了一件事,德里克的回答大多是正确的.获取然后设置数组属性不会在模型上生成更改事件.

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

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