2011-09-28 38 views
1

何時應該銷燬?它是否會被YUI生命週期自動調用?頁面卸載是否會導致YUI生命週期在頁面處理期間創建的所有對象上調用destroy?我一直在假設我需要自己完成所有的調用來銷燬,但是當ajax調用代替逐漸增強的代碼段時,這會變得非常棘手。例如:何時致電YUI銷燬?

<div id="replaceMe"> 
    <table> 
    <tr> 
     <td>1</td> 
    </tr> 
    <tr> 
     <td>2</td> 
    </tr> 
    </table> 
    <script> 
    YUI().use('my-lib', function(Y) { 
     Y.mypackage.enhanceTable("replaceMe"); 
    }); 
    <script> 
</div> 

my-lib模塊基本上是增加點擊處理程序和鼠標懸停的每一行:

YUI.add('my-lib', function(Y) { 
    function EnhancedTable(config) { 
     EnhancedTable.superclass.constructor.apply(this, arguments); 
    } 
    EnhancedTable.NAME = "enhanced-table"; 
    EnhancedTable.ATTRS = { 
     containerId : {}, 
     onClickHandler : {}, 
     onMouseoverHandler : {}, 
     onMouseoutHandler : {} 
    }; 
    Y.extend(EnhancedTable, Y.Base, { 
     _click : function(e) { 
      //... submit action 
     }, 
     destructor : function() { 
      var onClickHandler = this.get("onClickHandler"), 
      onMouseoverHandler = this.get("onMouseoverHandler"), 
      onMouseoutHandler = this.get("onMouseoutHandler"); 

      onClickHandler && onClickHandler.detach(); 
      onMouseoverHandler && onMouseoverHandler.detach(); 
      onMouseoutHandler && onMouseoutHandler.detach(); 
     }, 
     initializer : function(config) { 
      var container = Y.one("[id=" + this.get("containerId") + "]"); 

      this.set("container", container); 
      this.set("onMouseoverHandler", container.delegate("mouseover", 
        this._mouseover, "tr", this)); 
      this.set("onMouseoutHandler", container.delegate("mouseout", 
        this._mouseout, "tr", this)); 
      this.set("onClickHandler", container.delegate("click", 
        this._click, "tr", this)); 
     }, 
     _mouseout : function(e) { 
      e.currentTarget.removeClass("indicated"); 
     }, 
     _mouseover : function(e) { 
      e.currentTarget.addClass("indicated"); 
     } 
    }); 

    Y.namespace("mypackage"); 
    Y.mypackage.enhanceTable = function(containerId) { 
     var enhancedTable new EnhancedTable({containerId:containerId}); 
    }; 
}, '0.0.1', { 
    requires : [ 'base', 'node' ] 
}); 

單擊處理程序將提交一個請求到我的應用程序將改變頁面。我是否需要記住所有增強的表格對象,並且有一個onunload處理程序調用每個的destroy方法?或者YUI框架是否照顧到了這一點?

這個問題的最後一部分是,我也有代碼之外的代碼,通過替換<div id="replaceMe">的內容替換整個表。在此過程中,腳本將重新運行並用新的EnhancedTable增加新的<table>。我是否需要記住舊桌子,並在新桌子破壞之前銷燬它?

回答

4

而不是設置爲處理程序屬性我想他們都存儲在一個這樣的數組:

this._handlers = [ 
    container.delegate("mouseover", this._mouseover, "tr", this), 
    container.delegate("mouseout", this._mouseout, "tr", this), 
    container.delegate("click", this._click, "tr", this) 
]; 

然後添加不析構函數方法如下

destructor : function() { 
    new Y.EventTarget(this._handlers).detach(); 
} 

它完成同樣的事情但你的工作方式較少!

理想情況下,不要在每張表上運行此操作,而是將所有代表附加到#replaceMe,以便每次更改內容時都不需要重新創建,無論發生在哪裏。

YUI不會在卸載時自動調用.destroy(),它會清理DOM子目錄。以上是額外的功勞,如果你打算自己摧毀這個物體,那真的只有這個必要。