2013-10-13 161 views
7

我見過很多指令的例子,包括那些AngularUI team,他們似乎沒有做任何清理。

下面是他們的ui-date指令創建jQuery datepicker的一個例子。 (source)

element.on('blur', function() { ... }); 

它們放置在元素上的事件處理程序,但在任何時候,做他們曾經取消綁定事件。我會期待有這樣的代碼,如:

var namespace = ".uiDate"; 

element.on('blur' + namespace, function() { ... }); 
element.on("$destroy" + namespace, function() 
{ 
    element.datepicker("destroy");  //Destroy datepicker widget 
    element.off(namespace);    //Unbind events from this namespace 
}); 

所以這讓我想知道是否有什麼我不明白。他們在做什麼導致內存泄漏的情況下,元素w /該指令被反覆創建和銷燬?

我錯過了什麼?

+0

一個非常有用的答案類似的問題:HTTP:/ /stackoverflow.com/questions/26983696/angularjs-does-destroy-remove-event-listeners – hgoebl

回答

6

是的,理想情況下,你應該清理附加到鏈接到指令的元素以外的元素的任何事件處理程序。

前面的例子,如果在你的指令中你有一個窗口調整大小的函數來修改指令的元素,當指令被銷燬時你將需要去除窗口大小調整事件。

這裏是一個例子指令,我必須建立,你可以看到,我不得不取消綁定連接指令的範圍之外的事件處理程序:

lrApp.directive('columnArrow',function($timeout){ 
    return { 
    restrict : 'A', 
    scope : { 
     active : '=columnArrow' 
    }, 
    link: function($scope, elem, attrs, controller) { 
     $scope.$watch('active',function(){ 
      $timeout(function(){ 
      adjust(); 
      },0); 
     }); 

     $(window).resize(adjust); 

     elem.parents('.column-content').scroll(adjust); 

     $scope.$on('$destroy', function() { 
      elem.removeClass('hide'); 
      elem.parents('.column-content').unbind('scroll',adjust); 
      $(window).unbind('resize',adjust); 
     }); 

     function adjust(e) { 
      if($scope.active) { 
      var parentScroll = elem.parents('.column-content'); 
      var parent = elem.parent(); 
      var visible = inView(parentScroll[0],parent[0]); 
      if(!visible) { 
       elem.addClass('hide'); 
      } else { 
       elem.removeClass('hide'); 
      } 
      var offset = parent.offset(); 
      var w = parent.outerWidth(); 
      var h = (parent.outerHeight()/2) - (elem.outerHeight()/2); 
      elem.css({'top':offset.top + h,'left':offset.left + (w + 5)}); 
      } 
     }; 

    } 
    } 
}); 
+0

如何刪除元素w /附加指令的事件處理程序? – CHS

+0

您可以看到我刪除了$ destroy函數中的任何事件處理函數,並且任何其他附加到該元素本身的事件都被刪除了。只有那些認爲在指令範圍之外的人需要刪除 – btm1

+0

你確定元素自己的偵聽器不需要被刪除嗎? – CMCDragonkai

相關問題