Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to put listen over $destroy while using controllerAs syntax in angular

Now I'm getting rid of $scope dependency from my angular controller to ensuring that I could easily migrate my code to Angular2. My current angular version is 1.4.X. While doing the same thing there is place while I placed $destroy listener over my controller scope like $scope.$on('$destory', function() ....).

I can see $on method only available on $scope of controller, but how can I achieve it without using $scope dependency.

like image 924
Pankaj Parkar Avatar asked Mar 12 '23 20:03

Pankaj Parkar


2 Answers

If you are using angular 1.5+ they added lifecycle hooks that you can opt into on your controller. No $scope needed. Just add a function called $onDestroy() to your controller and it will be called when your controller is being clean up:

$onDestroy() - Called on a controller when its containing scope is destroyed. Use this hook for releasing external resources, watches and event handlers.

Example from http://blog.thoughtram.io/angularjs/2016/03/29/exploring-angular-1.5-lifecycle-hooks.html:

function MyCmpController($element) {

  var clickHandler = function () {
    // do something
  };

  this.$onInit = function () {
    $element.on('click', clickHandler);
  };

  this.$onDestroy = function () {
    $element.off('click', clickHandler);
  };
}
like image 54
pgreen2 Avatar answered Apr 17 '23 18:04

pgreen2


After some research I found that the $destroy event is emitted while removing DOM & on that same DOM scope it broadcasts $destroy event, but at the same time same that event has been propagated on DOM which is going to be removed.

You know there is one dependency $element, if you inject that in controller will give you the DOM where you have ng-controller directive place. So inject $element inside your controller & then place listener over it like below

$element.on('$destroy', function(){
   //write clean up code here
});

Mine solution will work till 1.4.X version. For 1.5.3+ version you could use Angular lifecycle hook which is $onDestroy like shown by @pgreen2 in above answer. Thanks :)

like image 43
Pankaj Parkar Avatar answered Apr 17 '23 19:04

Pankaj Parkar