javascript - $rootScope.$emit 和 $on

标签 javascript angularjs rootscope

我正在使用 Angular 开发一个大型应用程序,我需要使用 $rootscope.$emit 启动一个事件,并在工厂内监听此事件。我无法在 Controller 内执行此操作,因为当我初始化用户时, Controller 尚未加载。

该代码有效,但我想知道这是否是最好的方法。

工厂一,发出事件:

angular
.module('app.core')
.factory('AuthenticationService', ['$rootScope', 'requestHttpService', AuthenticationService])

    function AuthenticationService($rootScope, requestHttpService) {
        var isLoggedIn = false;
        return {
            logIn: logIn
        }
        function logIn(action) {
            return requestHttpService.runOpenRequest(action)
                    .then(logInComplete)
                    .catch(logInError);

            function logInComplete(userData) {
                $rootScope.$emit('initUser', userData);
            }

            function logInError(error) {
                console.log('Something went wrong:  ' + error);
            }
        }
    };

工厂二,监听事件:

angular
   .module('app.user')
   .factory('manageUser', ['$rootScope', manageUserFactory]);

    function manageUserFactory($rootScope) {
        var user = {'id': '', 'name': ''};
        $rootScope.$on('initUser', function (event, userData) {
            initUser(userData);
        });

        return {
            initUser: initUser
        }

        function initUser(userData) {
           user = {'id': userData.id, 'name': userData.name};
        }
    };

最佳答案

我建议不要在这里使用事件。

当您使用 $emit 时,$emit 在范围层次结构中向上移动,包括发出它的当前范围,在您的示例中 $rootScope 已经位于顶部。因此它将仅用于通知绑定(bind)到 $rootScope 的事件。

我建议直接通过注入(inject)来调用工厂方法,如下所示: 替换 $rootScope.$emit('initUser', userData); 通过在 AuthenticationService 中注入(inject) manageUser 工厂来使用 manageUser.initUser();

由于性能成本,事件是最不受欢迎的。

关于javascript - $rootScope.$emit 和 $on,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36080897/

相关文章:

javascript - 为什么选中复选框时会显示不正确的数据值?

javascript - 单击 chrome 扩展 DOM(popup.html) 上的按钮时,扩展 DOM 关闭并且不会在 popup.js 中调用 onclick 函数

javascript - Emberjs 应用程序刷新索引以外的路由会出现 404 错误

javascript - 正则表达式在一个单词后留出空格

css - 设置 select2 输入的宽度(通过 Angular-ui 指令)

javascript - Angular 指令 - NgModelCtrl 解析器问题

AngularJS ui-router 登录后重定向

javascript - 用于匹配多个属性的 Angular 指令

javascript - AngularJS $rootScope 变量存在,但无法访问