2013-06-03 63 views
1

我正在ASP.Net中創建一個Ajax客戶端控件。從IScriptControl繼承,然後添加相關的JavaScript類(它將繼承自一個javascript控件)。我已經找到了內存泄漏下面的代碼:Ajax客戶端控制 - 內存泄漏

Type.registerNamespace("mynamespace"); 

myClass = function (element) { 

    myClass.initializeBase(this, [element]); 
} 

myClass.prototype = { 

    initialize: function() { 

     myClass.callBaseMethod(this, 'initialize'); 


     var me = this; 

     $(document).ready(function() { 

      me._initializeControl(); 
      me._hookupEvents(); 

     }); 

    }, 

    dispose: function() { 
     //Add custom dispose actions here 
     myClass.callBaseMethod(this, 'dispose'); 
    }, 
//...other code ... 

    _hookupEvents: function() { 
     var me = this; 
     var e = this.get_element(); 
     $("#viewRates", e).click(function() { 
      me.openDialog(); 
     }); 

    }, 
//...other code... 
myClass.registerClass('myClass', Sys.UI.Control); 

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded(); 

_hoookupEvents是我的JavaScript文件中的函數。泄漏與me.openDialog行相關。如果我刪除這條線,就沒有泄漏。然而,我需要這一行能夠從類中調用一個函數(我不能只在函數中使用'this',因爲它會引用該按鈕)。有一個更好的方法嗎?或者,我可能只需要在dispose函數中調用一些方法來清理這些東西?

+0

您是如何檢測到泄漏的?你有沒有泄漏的物體或元素的想法? –

+0

使用Chrome開發人員工具 - 堆快照。如果我離開那行代碼,我可以看到有2個myclass實例(當我做回發時)。我刪除了代碼行......並且只有一個實例(即使在幾次回發之後)。 –

+0

我想你的意思是回發是用UpdatePanel完成的。 – Aristos

回答

1

這段代碼的內存泄漏可能發生在這條線,你也注意到

$("#viewRates", e).click(function() { 
     me.openDialog(); 
    }); 

當你的UpdatePanel調用它,或在一般叫它爲同一部件,並與出先清除以前點擊事件,之前的處理程序停留在這裏,這裏我們有兩種情況。

  • 要註冊多個相同的點擊事件。
  • 要用ajax更新dom,而不是先前清除那些處理程序,結果以前的代碼永遠保持(永遠==直到你離開頁面)。

一般的解決辦法是清除以前的處理程序,點擊,

  • 前添加一個新的。
  • 當使用UpdatePanel初始化一個新的ajax調用時,在獲得新的響應之前。

使用類似的函數來刪除點擊並清除處理程序的資源。

this.get_events().removeHandler('click');

1

如果只有2個myclass實例,我非常猶豫稱它爲內存泄漏。如果有2,000個myclass實例,那麼肯定是泄漏。 我真的很難搜索任何動態實例化語句,這些語句在特定條件下創建myClass。這就是我所看到的很多(在應用程序init處創建循環中的類,也許表單提交可能觸發實例化,並且它沒有完全查詢是否可以獲得創建多個對象的提交等)。