2016-09-28 11 views
0

メモリリークに関する質問があります。 このコードのブロックをご覧ください:jquery、kendo memory leaksの質問

(function ($) { 

$.fn.bnftWindow = function (options) { 

    // Default Settings 
    var settings = $.extend({ 
    }, options); 

    // Validate parameters 
    if (settings.id === undefined || settings.id === null || settings.id === "") { 
     throw "bnftWindow id option is undefined, null or empty string"; 
    } 


    // If window container div already exists 
    if ($("#" + settings.id).length) { 
     alert("bnftWindow id already exists - will be destroyed and recreated"); 
     // destroy window container div 
     $("#" + settings.id).remove(); 
    } 

    // create window container div 
    $("body").append("<div id='" + settings.id + "'></div>"); 

    var currentInstance = $("#" + settings.id); 

    return currentInstance.each(function() { 

     currentInstance.data("bnftWindow", currentInstance); 

     var widgetId = currentInstance[0].id; //The id of the html element used to create the bnft widget 

     // Apply settings 
     $('#' + widgetId).kendoWindow(
      settings 
     ); 

     var dialog = $('#' + widgetId).data("kendoWindow"); 

     currentInstance.destroy = function() { 


      kendo.destroy($("#" + widgetId)); 

      $("#" + settings.id).remove(); 
     } 
    }); 



    function onRefresh(e) { 

     // Always center window first 
     if (settings.refresh !== undefined) { 
      settings.refresh(e); 
     } 

     var dialog = $("#" + settings.id).data("kendoWindow"); 
     dialog.center(); 
    } 
}; 

}(jQuery)); 

そして、このコードブロック:

function Test() 
{ 
    var element = $("#myElement"); 
    element.hide(); 
    var that = this; 

    this.ids = { 
     grid: "messagesGrid", 
     gridButton: "gridButton", 
     composeWnd: "composeWnd" 
    }; 

    this.grid = null; // will store the grid later 


     $("#" + this.ids.gridButton).on("click", function() { 
      try { 
        // Do something.... 
        that.init(); 
       } 
      } 
      catch (ex) { 
       alert("Error: " + ex); 
      } 
     }); 

} 

Test.prototype.init = function() 
{ 
    // Do something else... 
    var that = this; 

    setTimeout(function() { 
     that.createWidget(); 
    }, 500); 
} 

Test.prototype.createWidget = function() 
{ 
    // Do something else... 
    $("#grid").kendoGrid({ // Some properties here }); 

    // store grid 
    this.grid = $("#grid").data("kendoGrid"); 
    // Blah blah blah 
} 
  1. は、変数currentInstance、ウィジェットID、ダイアログ、要素、つまり、これを行います。グリッド、またはメモリリークの原因となるイベントハンドラ?

  2. 要素変数がメモリリークを引き起こしている場合は、$( "#myElement")。hide();ソリューション? (hideの後に要素変数をnullに設定することに加えて)。

ありがとうございます。

+0

あなたはChromeデベロッパーツールを使用して記録をタイムラインをやってみましたか?これは、漏れがあるかどうかを簡単に確認するのに役立ちます。メモリリークを追跡するワークフローの例については、[このビデオ](https://youtu.be/LaxbdIyBkL0?t=236)を参照してください。 – Corina

答えて

0

私はダイアログインスタンスをクリーンアップするために、次の作品:

_create: function() {   
     var that = this; 
     ...  
     that.frmElement = that.wrapper.kendoWindow({ 
      ... 
      close: function (e) { 
       this.destroy(); 
       that.wrapper.remove("#" + that.options.dialogId); 
       that.wrapper.empty(); 
      } 
      ... 
     }).data("kendoWindow"); 
    }