$ rootScope。$ emit和$ on

时间:2016-03-18 09:39:10

标签: javascript angularjs rootscope

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

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

工厂一,发出事件:

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};
        }
    };

1 个答案:

答案 0 :(得分:1)

我建议不要在这里使用活动。

当你使用$ emit和$ emit在范围层次结构中向上移动时,包括它发出的当前范围,在你的示例中,Columns("A:A").Select Selection.TextToColumns Destination:=Range("A:A"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _ :=Array(1, 2), TrailingMinusNumbers:=True 已经位于顶部。因此,它仅用于通知绑定到$rootScope的事件。

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

事件是最不受欢迎的,因为它们的性能成本。