首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >$rootScope.$emit和$on

$rootScope.$emit和$on
EN

Stack Overflow用户
提问于 2016-03-18 17:39:10
回答 1查看 534关注 0票数 0

我正在用Angular开发一个大型应用程序,我需要用$rootscope.$emit启动一个事件,并在工厂里收听这个事件。我不能在控制器中这样做,因为当我初始化用户时,控制器还没有加载。

代码可以工作,但我想知道这是否是最好的方法。

工厂一,它发出事件:

代码语言:javascript
复制
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);
            }
        }
    };

和工厂二,它们监听事件:

代码语言:javascript
复制
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};
        }
    };
EN

回答 1

Stack Overflow用户

发布于 2016-03-18 17:56:13

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36080897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档