angularjs controllerAs注册$ destroy

rek*_*kna 18 angularjs

angular的文档说,为了在控制器被销毁时执行清理代码,应该在范围内注册$ destroy事件.

$scope.$on("$destroy", function() { ... } );
Run Code Online (Sandbox Code Playgroud)

但是,当您使用controllerAs语法时,您无权访问$ scope.你如何注册$ destroy事件?

gka*_*pak 22

仅仅因为你使用controllerAs语法,它并不意味着没有$scope或你不能使用它.

实际上,所有的controllerAs操作都是this在$scope(在指定名称下)添加控制器.例如:

ng-controller="SomeCtrl as ctrl"
Run Code Online (Sandbox Code Playgroud)

将隐含地这样做:

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

    // Angular will implicitly so something equivalent to:
    // $scope.ctrl = this;
}
Run Code Online (Sandbox Code Playgroud)

所以,没有什么可以阻止你使用它$scope(它实际上非常有用的东西,如$watch东西和发送/监听事件):

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

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

    $scope.$on('$destroy', function () {
        // So some clean-up...
    });
});
Run Code Online (Sandbox Code Playgroud)

另见这个简短的演示.