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 回表示されます。アップバックボーンとは?

ここに素晴らしい画像の説明を入力してください。

4

3 に答える 3

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 に答える