BackboneJS - 重新实例化后保留的视图类数组变量

时间:2012-08-23 08:45:48

标签: backbone.js

我遇到一个我无法解释的场景/错误,因为我有一个带有数组变量的Backbone View类,但是即使在我重新实例化之后变量值仍然存在。骨干视图具有以下设置:

var TestView = Backbone.View.extend({
    a:"",
    b:"",
    items:[],
    initialize:function(){

    },
    add:function(value){
        this.items.push(value);
    }
});

以下是我实例化类的方法:

this.formView = new TestView();
this.formView.add('halo');
this.formView.a = 'abc';

this.formView = new TestView();
this.formView.add('test');
this.formView.b = 'bcd';

console.log("a - " + this.formView.a);
console.log("b - " + this.formView.b);
console.log("items - ");
console.log(this.formView.items);
​   

结果:

a -  
b - bcd 
items -  ["halo", "test"] 

令人惊讶的是,数组变量'items'仍然存在,它同时显示['halo','test']。但不适用于正常变量。

这是JsFiddle link

可以通过在初始化函数中清除数组来解决这个问题。

    initialize:function(){
      this.items = [];  
    },

但我想知道这是一个错误还是我误解了什么。

1 个答案:

答案 0 :(得分:7)

嗯,问题很棘手,但有一个解释。

首先,在类上下文中定义实例变量并不是一个好主意,这就是你正在做的事情:

var TestView = Backbone.View.extend({
  a: "",
  b: "",
  items: []
});

这是Model.defaults存在的原因之一。你应该这样做:

var TestView = Backbone.View.extend({
  initialize: function(){
    this.a = "";
    this.b = "";
    this.items = [];
  }
});

您的示例代码中发生的事情是TestView的所有新引用都将共享StringArray的相同实例。这是因为在一个实例中更改数组将反映在另一个实例中。

最棘手的事情,你敏捷地观察到,看起来好像是字符串没有发生共享行为,但事实上它正在发生。

当你这样做时:

this.formView.a = 'abc';

您不是转换 String实例,而是将其替换为新实例,以便原始的String实例保持不变。

我想在一个TestView实例中提供一个操作字符串的示例,并看到更改反映在另一个TestView实例中,但我没有找到任何实例JS String method就地操纵字符串。