Подтвердить что ты не робот

Angularjs controllerAs зарегистрировать $destroy

Документация angular говорит, что для выполнения кода для очистки при уничтожении контроллера необходимо зарегистрировать событие $destroy в области.

$scope.$on("$destroy", function() { ... } );

Однако, когда вы используете синтаксис controllerAs, у вас нет доступа к $scope. Как бы вы зарегистрировали событие $destroy?

4b9b3361

Ответ 1

Просто потому, что вы используете синтаксис controllerAs, это не значит, что нет $scope или вы не можете его использовать.

Фактически, все controllerAs - это добавить контроллер this в $scope (под указанным именем). Например:.

ng-controller="SomeCtrl as ctrl"

будет делать это неявно:

.controller('SomeCtrl', function () {
    this.value = 'something';
    ...

    // Angular will implicitly so something equivalent to:
    // $scope.ctrl = this;
}

Итак, нет ничего, что помешало бы вам использовать $scope (это действительно полезно для таких вещей, как $watch ing stuff и отправка/прослушивание событий):

<!-- In the VIEW -->
<div ng-controller="SomeCtrl as ctrl">
    Some value: {{ctrl.value}}
    <button ng-click="ctrl.doSomething()">Some action</button>
</div>

/* In the CONTROLLER */
.controller('SomeCtrl', function ($scope) {
    this.value = 'some value';
    this.doSomething = function () { ... };

    $scope.$on('$destroy', function () {
        // So some clean-up...
    });
});

См. также эту короткую демонстрацию.

Ответ 2

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

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

Ответ 3

Это также возможно без ввода $scope:

.controller('SomeCtrl', function () {
    var vm = this;
    vm.$onDestroy = function(){
        console.log( 'destroying....' );
    }   
}