如何使用Controller作为语法访问$ on,$ emit,$ broadcast方法?

Dan*_*zik 17 angularjs

使用$scope它很容易发出事件或观看一个事件.

(function() {
    "use strict";

    angular
        .module("app")
        .controller("Ctrl", [
            "$scope",
            CtrlDefinition
        ]);

    function CtrlDefinition($scope) {
        $scope.$on("change", listenForChange);

        function listenForChange(data) {
            //do something
        }
    }
})();
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用var vm = this语法,我警告说$on,$emit$broadcast不是的方法this.我怎样才能访问它们?我还需要注入$scope控制器定义吗?

(function() {
    "use strict";

    angular
        .module("app")
        .controller("Ctrl", CtrlDefinition);

    function CtrlDefinition() {
        var vm = this;
        vm.$on("change", listenForChange); //$on is not a method of vm
    }

})();
Run Code Online (Sandbox Code Playgroud)

你可以做这样的事情,但它不会打败不必使用的目的$scope吗?

(function() {
    "use strict";

    angular
        .module("app")
        .controller("Ctrl", [
            "$scope",
            CtrlDefinition
        ]);

    function CtrlDefinition($scope) {
        var vm = this;
        vm.scope = $scope;
        vm.scope.$on("change", listenForChange);
    }

})();
Run Code Online (Sandbox Code Playgroud)

如何使用控制器作为语法访问观察者?

Dav*_*d L 23

为了使用存在的任何东西$scope,你被迫注射$scope.不幸的是,这很简单,这是"as"语法的缺点.

然而,好消息是,注入$scope一起this并不会改变控制器的语法功能,它只是使您能够访问所有的事件管理是住在的 $scope.

值得注意的是,这是Angular 2.0中出现的主要原因之一...... $scope在"控制器为"语法之间存在一个真正的问题和差异,这种语法被用于解决视图中的范围问题.