0

是的,这个标题没有多大意义。

我有一个看法。此视图创建子视图。这些子视图存储在一个数组中,以便我可以在某个时候删除它们。

MN.ContactsView = MN.BaseView.extend ({

tagName : "div",

contactViewItems : [],

initialize : function(){        
    this.listenTo(MN.client.contacts, "add", this.addOne);
    this.listenTo(MN.client.contacts, "reset", this.addAll);
    this.listenTo(MN.client.contacts, "all", this.render);      
    MN.client.contacts.fetch();

},  render: function(){

},

addOne : function($contactModel){       
    var view = new MN.ContactsViewItem({model: $contactModel});
    this.contactViewItems.push(view);
    $("#contactsContainer").append(view.render().el);

},

addAll : function(){
    MN.client.contacts.each(this.addOne, this)
},

close : function(){

},

destroy: function(){
    for(var i =0; i < this.contactViewItems.length; i++) this.contactViewItems[i].destroy();
    this.contactViewItems = [];
    debugger;
    console.log("Length: " + this.contactViewItems.length );
    MN.BaseView.prototype.destroy.call(this);   
},

当我销毁视图并检查调试器时,我看到相同的变量 2 次。什么是骨干?

在这里输入很棒的图片描述,dawg

4

3 回答 3

3

当您使用该extend方法创建类时,您提供的属性将放入原型中。这意味着,它们将由您班级的所有实例共享。如果您碰巧在某些情况下更改了该属性的值,您将隐藏原型,以便该属性具有新值,不再与原型链接。

所以,这就是这里发生的事情:

当您使用 进行修改contactViewItemsthis.contactViewItems.push(view);,您不会更改存储在原型中的值。相反,您更改了该值所指向的对象。因此,您仍在修改一个由您的类的所有实例共享的数组。

但是,当您这样做时this.contactViewItems = [];,您实际上是在更改值,因为您正在给它一个全新的对象。在那一刻,您只需为这个实例创建的原型。原型当然仍然存在(您没有对它做任何事情),因此您会看到该属性两次。

现在,它肯定不会像您希望的那样工作,并且我相信您现在可以想到几种解决方案,因为您知道问题的核心(我不知道您的应用程序的详细信息,所以我没有更多的细节就帮不上什么忙了)。

于 2013-07-02T12:37:45.320 回答
0

当我销毁视图并检查调试器时,我看到相同的变量 2 次。

因为您已经在destroy函数中的实例上第二次创建了它:

this.contactViewItems = [];

如果您想清除原型上的数组,您应该使用

MN.ContactsView.prototype.contactViewItems = [];

或者

this.contactViewItems.length = 0;
于 2013-07-02T12:40:39.640 回答
0

正如 Loamhoof 指出的那样,问题在于您的 contactViewItems 是您的 ContactsViews 原型的属性。

修改视图使其行为符合您预期的一种简单方法是不要使用空数组初始化contactViewItems。相反,在您的初始化中创建空数组。

例如:

MN.ContactsView = MN.BaseView.extend ({

tagName : "div",

contactViewItems : null,

initialize : function(){        
    this.contactViewItems = [];
    this.listenTo(MN.client.contacts, "add", this.addOne);
    this.listenTo(MN.client.contacts, "reset", this.addAll);
    this.listenTo(MN.client.contacts, "all", this.render);      
    MN.client.contacts.fetch();
},  

现在,将项目添加到 this.contactViewItems 是直接在视图对象上(在这种情况下您可能想要的),而原型包含一个为 null 的 contactViewItems。

于 2013-10-28T20:40:24.593 回答