1

我已经阅读了很多关于每次都实例化同一个主干视图的多个实例的问题的帖子,并且即使不再使用视图,视图也会在 DOM 中徘徊,以及如何通过使用this.remove()this.unbind()

但是如何删除视图中声明的变量,如下所示:

var myview = Backbone.View.extend({
    el : '#somediv',
    var1 : '',
    var2 : '',
    array1 : [],

    initialize : function() { //init code here 
    },

    render : function() { //rendering code here 
    }
});

所以我的问题是,我如何删除在那里声明的那些变量的实例:var1、var2、array1。每次单击按钮时,我都必须调用此视图。每次我看到这些变量的先前值仍然存在。this.remove()并且this.unbind()可能只是从 DOM 中删除视图并取消其事件绑定。

4

1 回答 1

4

您在Backbone.View.extend调用中定义的属性附加到原型,因此由您的视图的所有实例共享(即它们有点像类属性而不是实例属性)。这对您来说应该没问题var1var2因为您只需为每个实例分配新值;但是,array1数组和类似属性可能会出现问题;假设你这样做:

var v = new myview;
v.array1.push('pancakes');

创建一个新实例不会从原型中深度复制所有内容,因此v.array1将引用原型中的数组。这意味着下一个new myview已经有了'pancakes'

通常的解决方案是在构造函数中初始化实例属性。对于 Backbone,构造函数是initialize

var myview = Backbone.View.extend({
    el: '#somediv',
    initialize: function() {
        this.var1 = '';
        this.var2 = '';
        this.array1 = [ ];
    },
    //...
});

您也可能会遇到问题,el: '#somediv'因为它唯一地标识了单个 DOM 元素。只要您要删除并重新创建该元素,就可以了;我建议让视图创建和销毁它自己的视图el,这样你会遇到更少的僵尸和泄漏。

于 2013-05-20T07:00:36.887 回答