7

Widziałem wiele przykładów dyrektyw, w tym te z AngularUI team, gdzie nie wydają się czyścić.

Oto przykład z dyrektywy ui-date, która tworzy dateticker jQuery. (source)

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

one umieszczane obsługi zdarzeń na elemencie, ale w żadnym momencie nie kiedykolwiek rozpiąć zdarzenia. Spodziewałam się obecności kodu:

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 
}); 

To sprawia, że ​​zastanawiam się, czy jest coś, czego nie rozumiem. Czy to, co robią, nie spowoduje przecieku pamięci w sytuacjach, gdy element w/tej dyrektywie jest tworzony i niszczony w kółko?

Czego mi brakuje?

+0

Podobne pytanie o bardzo użytecznej odpowiedzi: http://stackoverflow.com/questions/26983696/angularjs-does-destroy-remove-event-listeners – hgoebl

Odpowiedz

6

Tak, najlepiej wyczyść wszystkie programy obsługi zdarzeń dołączone do elementów innych niż element powiązany z dyrektywą.

Na przykład, jeśli w swojej dyrektywie masz funkcję zmiany rozmiaru okna, aby zmodyfikować element dyrektywy, będziesz musiał usunąć zdarzenie zmiany rozmiaru okna, gdy dyrektywa zostanie zniszczona.

oto dyrektywa przykład musiałem zbudować i widać musiałem rozpiąć obsługi zdarzeń załączone poza zakresem dyrektywy:

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 jaki sposób usuwa się moduły obsługi zdarzeń dla elementu z dołączoną dyrektywą? – CHS

+0

Możesz zobaczyć, że usuwam wszystkie funkcje obsługi zdarzeń w funkcji $ destroy, a wszelkie inne zdarzenia, które są dołączone do samego elementu, są usuwane przez kąt. Tylko te, które są powiązane z myślami spoza zakresu dyrektywy, musisz usunąć. – btm1

+0

Czy jesteś pewien, że nie trzeba usuwać własnych odbiorców elementu? – CMCDragonkai

Powiązane problemy