2016-09-12 82 views
1

我知道如何在$scope上使用,發射和廣播事件。

在我看來,使用$rootScope主要是類似於$範圍除了$rootScope.$emit將火爲$rootScope.$on監聽的事件而已,$rootScope.$broadcast會通知所有$rootScope.$on以及$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'); 
      } 
     }); 
    } 

})(); 

回答