不清楚$ rootScope.emit()?

时间:2016-09-12 06:49:12

标签: angularjs

我知道如何在$scope中使用on,emit和broadcast事件。

在我看来,使用$rootScope主要类似于$ scope,但$rootScope.$emit只会为所有$rootScope.$on个侦听器触发事件​​,$rootScope.$broadcast将通知所有$rootScope.$on 1}}以及$scope.$on个侦听器。

但是,我对一个仅在整个项目中使用$rootScope.$on的教程代码感到困惑。该项目允许用户路由到不同的页面并使用他们的cookie来确保登录状态。

我没有找到任何线索,它调用emit()broadcast()来触发侦听器的事件。 emit()broadcast()会在项目中触发,还是根本不需要它?谁能解释这种现象背后的登录?在哪些情况下,$rootScope不需要emit()broadcast()

以下是部分代码:

(function () {
    'use strict';

    angular
        .module('app', ['ngRoute', 'ngCookies'])
        .config(config)
        .run(run);

    config.$inject = ['$routeProvider', '$locationProvider'];
    function config($routeProvider, $locationProvider) {
        $routeProvider
            .when('/', {
                controller: 'HomeController',
                templateUrl: 'home/home.view.html',
                controllerAs: 'vm'
            })

            .when('/login', {
                controller: 'LoginController',
                templateUrl: 'login/login.view.html',
                controllerAs: 'vm'
            })

            .when('/register', {
                controller: 'RegisterController',
                templateUrl: 'register/register.view.html',
                controllerAs: 'vm'
            })

            .otherwise({ redirectTo: '/login' });
    }

    run.$inject = ['$rootScope', '$location', '$cookieStore', '$http'];
    function run($rootScope, $location, $cookieStore, $http) {
        // keep user logged in after page refresh
        $rootScope.globals = $cookieStore.get('globals') || {};
        if ($rootScope.globals.currentUser) {
            $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
        }

        $rootScope.$on('$locationChangeStart', function (event, next, current) {
            // redirect to login page if not logged in and trying to access a restricted page
            var restrictedPage = $.inArray($location.path(), ['/login', '/register']) === -1;
            var loggedIn = $rootScope.globals.currentUser;
            if (restrictedPage && !loggedIn) {
                $location.path('/login');
            }
        });
    }

})();

1 个答案:

答案 0 :(得分:2)

$ locationChangeStart事件在$ rootScope上由angular本身广播(确切地说是$ location服务):https://docs.angularjs.org/api/ng/service/$location#$locationChangeStart