簡體   English   中英

$ rootScope。$ emit和$ on

[英]$rootScope.$emit and $on

我正在使用Angular開發一個大型應用程序,並且需要使用$ rootscope。$ emit啟動一個事件,並在工廠中收聽此事件。 我無法在控制器內部執行此操作,因為當我初始化User時,該控制器尚未加載。

該代碼有效,但是我想知道這是否是最好的方法。

發出事件的工廠一:

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已經在頂部。 因此,它將僅用於通知綁定到$rootScope事件。

我建議通過如下注入直接調用工廠方法:replace $rootScope.$emit('initUser', userData); manageUser.initUser(); 通過在AuthenticationService注入manageUser工廠。

最不推薦使用事件,因為它們的執行成本很高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM