Как поставить listen over $destroy при использовании синтаксиса controllerAs в угловых

Теперь я избавляюсь от $scope зависимость от моего углового контроллера для обеспечения того, чтобы я мог легко перенести мой код в Angular2. Моя текущая угловая версия 1.4.X, Делая то же самое, есть место, пока я $destroy слушатель над моим контроллером объема, как $scope.$on('$destory', function() ....),

я могу видеть $on метод доступен только на $scope контроллера, но как я могу добиться этого без использования $scope зависимость.

2 ответа

Решение

Если вы используете Angular 1.5+, они добавили хуки жизненного цикла, которые вы можете использовать на своем контроллере. нет $scope необходимо. Просто добавьте функцию под названием $onDestroy() на ваш контроллер, и он будет вызван, когда ваш контроллер очищается:

$onDestroy() - Вызывается на контроллере, когда его содержащая область уничтожена. Используйте этот хук для освобождения внешних ресурсов, часов и обработчиков событий.

Пример из 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);
  };
}

После некоторых исследований я обнаружил, что $destroy Событие генерируется при удалении DOM и в той же области DOM, которое оно передает $destroy событие, но в то же время это событие было распространено на DOM который будет удален.

Вы знаете, что есть одна зависимость $element, если вы введете, что в контроллере даст вам DOM, где у вас есть ng-controller директивное место. Так впрыскивать $element внутри вашего контроллера и затем поместите слушателя над ним, как показано ниже

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

Мой раствор будет работать до версии 1.4.X. Для версии 1.5.3+ вы можете использовать Angular lifecycle hook который $onDestroy как показано @pgreen2 в ответе выше. Спасибо:)

Другие вопросы по тегам