Angularjs:$scope.emit 不工作

Angularjs: $scope.emit is not working

我是 angularjs 的新手,我正在创建一个 Web 应用程序来积累经验和练习。我遇到的问题是 $scope.$emit 似乎不起作用,我正在寻找在控制器之间联系功能的方法,到目前为止我在互联网上发现 $scope.emit$scope.on 似乎为了适应这种任务,如果有另一种方法,我想知道,反正代码是这样写的:

loginController.js

(function(angular)
{
    var app = angular.module('Organizer');

    // inject $scope to the controller in order to try $scope.$emit
    app.controller('login', function($http, $scope)
    {
        // i define the scope like this so i can access inside other functions
        var scope = this;
        scope.processing = false;
        scope.message = null;

        scope.submit = function()
        {
            scope.processing = true;

            // store data for post
            var post = {
                username: scope.username,
                password: scope.password
            };

            // send post data
            $http.post('api/default/login', post).
                success(function(data, status)
                {
                    // hide processing feedback and show the result
                    scope.processing = false;
                    scope.message = data.message;
                }).
                error(function(data, status)
                {
                    scope.processing = false;
                });
        };

        // Function i use to emit
        this.closeDialog = function()
        {
            $scope.$emit('closeDialog');
        };
    });
})(angular);

siteController.js

(function(angular)
{
    var app = angular.module('Organizer');

    app.controller('site', function($mdDialog, $scope)
    {
        this.menu = ['test1', 'test2'];

        this.dialog = function()
        {
            $mdDialog.show({
                templateUrl: 'site/login',
            });
        };

        // this does not seem to be working
        $scope.$on('closeDialog', function(event)
        {
            console.log('close dialog');
        });
    });
})(angular);

注意: 我正在使用 angular material 你可以看到我正在显示一个对话框,它是一个登录,登录有它的控制器(我希望它使用同一个站点控制器,但我不知道怎么做)并且这个对话框有一个按钮调用 loginControler 中的函数 closeDialog() 并且应该关闭对话框,但是现在出于测试原因我只是记录它是否正在调用事件

$emit 函数仅将事件传播到作用域父级。

$broadcast 函数将事件传播到作用域子项。

所以你需要什么取决于控制器如何使用它...

如果你想让一个事件到达你必须使用 $rootScope 的所有应用程序:

$rootScope.$broadcast('myEvent');

Here you have the doc of the scope, include $emit and $broadcast

您无法在对话控制器中发出或广播,因为 angular material 中的对话具有隔离范围。因此,当您发出或广播一个事件时,它不会去任何地方。 $emit 和 $broadcast 仅在您具有范围层次结构时才有效。 $emit 在层次结构中向上传播事件,而 $broadcast 在层次结构中向下传播事件。