templateurl compile javascript angularjs angularjs-scope

javascript - compile - directive angularjs



Evento angular.js $ destroy-¿Debo desvincularlo manualmente? (3)

Estoy tratando de averiguar si la base angular desvincula automáticamente a los observadores y los eventos del alcance vinculados con $scope.$on(...) o $scope.$watch(...) cuando se destruye el alcance.

Supongamos que tengo el siguiente código:

$scope.$on(''someEvents'', handleSomeEvent); $scope.$watch(''someProperty'', handleSomePropertyChange);

¿Debo desvincular manualmente estos vigilantes y eventos cuando se desencadena el evento $ destroy en el alcance?


Como se respondió anteriormente, Angular se encarga de limpiar cosas para usted, siempre que sea posible. Entonces, si haces $scope.$on(''someEvents'', handleSomeEvent); Una vez que se destruye el alcance (por ejemplo, cuando vas a otra página / vista en tu aplicación), el evento se elimina automáticamente.

Sin embargo, una cosa importante a tener en cuenta es que $rootScope nunca se destruye, a menos que salga de su aplicación. Entonces, si haces $rootScope.$on(''someEvents'', handleSomeEvent); , puede que tenga que eliminar el evento usted mismo, dependiendo de dónde escuche el evento:

  • si está en un controller o directive , tendrá que eliminarlo manualmente, de lo contrario, cada vez que crea una instancia del controller , se adjuntará un nuevo evento, por lo que handleSomeEvent se llamará muchas veces
  • si está en un service , no es necesario que lo elimine manualmente, ya que los servicios son siempre singleton (tenga en cuenta que en el service angular, de factory , ... todos terminan siendo lo mismo)

De acuerdo con la documentación angular en $scope :

Se debe invocar ''$ destroy ()'' en un ámbito cuando se desee que el alcance y sus ámbitos secundarios se separen permanentemente del padre y, por lo tanto, dejen de participar en la detección de cambio de modelo y en la notificación de escucha mediante invocación.

también

La eliminación también implica que el alcance actual es elegible para la recolección de basura.

Entonces parece que cuando se llama $destroy() todos los vigilantes y oyentes son eliminados y el objeto que representa el alcance se vuelve eligible for garbage collection .

Si miramos el código fuente de destroy() veremos una línea:

forEach(this.$$listenerCount, bind(null, decrementListenerCount, this));

Que se supone que debe eliminar a todos los oyentes.

Como se menciona en @glepretre se aplica a los observadores y oyentes en el controlador. La misma página de documento enumerada anteriormente dice que:

Tenga en cuenta que, en AngularJS, también hay un evento $ destroy jQuery, que se puede utilizar para limpiar los enlaces DOM antes de que se elimine un elemento del DOM.

Entonces, si tiene oyentes específicos en las instrucciones, debe escuchar el evento $destroy y hacer la limpieza necesaria usted mismo.


Si el alcance está en un controlador, desenlace angular para usted. De lo contrario, puede desvincular su evento llamando a la función devuelta:

var myevent = $scope.$on(''someEvents'', handleSomeEvent); myevent() ; // unbind the event

http://docs.angularjs.org/api/ng/function/angular.bind