2012-02-21 47 views
0

我創建了一個類來在我的一個網頁上保存一個接口組件。有一個add按鈕來實例化類並將新元素插入到DOM中。我想給這個類一個remove方法從dom中刪除元素,然後銷燬這個實例。在mootools中刪除它?

我有這樣的:

// can have multiple tags 
var Tag = new Class({ 
    Implements: [Options, Events], 
    this.targetElement: undefined, 
    this.tagName: undefined 

    initialize: function() { 
     this.targetElement = new Element('input', { class: 'tag' }); 
     this.targetElement.inject($('tagHolder')); 

     ... 
     // event handler to set `this.tagName` to contents of the input 
     ... 

     if (Tag.tags === undefined) 
      Tag.tags = []; 
     Tag.tags.push(this); 
    }, 
    remove: function() { 
     this.targetElement.destroy(); 
     delete this; 
    } 

這將刪除DOM元素,但不刪除實例對象。

我想用數組tag.tags以訪問用戶已創建的所有變量,因此,如果用戶刪除一個標籤,我想從數組中刪除該標籤,或設置爲undefined,或類似。由於不再需要標記實例,因此在此時刪除/爲GC準備對象是有意義的,這樣內存不會被浪費。

我應該怎麼做,或者這是一個愚蠢的方法?有沒有更好的辦法?

+1

您只能在'對象delete'性質,所以'刪除this'是永遠不可能的。你在哪裏定義'Tag'變量?如果它是一個全局變量,那麼'delete window.Tag'就可以做到這一點,因爲全局變量是'window'的自動屬性。 – pimvdb 2012-02-21 13:10:26

+0

@pimvdb新實例來自'click'事件:'$$('。addTag')。addEvent('click',function(){new Tag()});'我沒有任何句柄除了通過Tag.tags之外的其他實例。 – Oliver 2012-02-21 13:15:35

+0

然後我猜你已經不走運了。以這種方式來看 - 對象可以存儲在多個變量中,因此對象和「其變量」之間不存在一對一的關係。無論如何,你想在這個例子中刪除什麼? – pimvdb 2012-02-21 13:18:41

回答

1

你應該可以使用Array.erase沒有任何問題。

改變你的刪除方法:

remove: function() { 
    this.targetElement.destroy(); 
    Array.erase(Tags.tags, this); 
    // reset reference 
} 
+0

太好了,謝謝。我只是意識到我可以做類似這樣的事情,但我試圖使用'Array.filter'來代替。 – Oliver 2012-02-21 13:42:06

+1

'this = null'是無效的語法。 – pimvdb 2012-02-21 13:57:16

+0

+1是的,左邊的任務,愚蠢的午餐時間代碼。不能真正自我毀滅。也許它應該嘗試從外部進行GC – 2012-02-21 14:32:51