2015-03-05 4 views
1

Я разрабатываю систему разрешений для моего приложения, используя завод, который выглядит следующим образом:Broadcast различные контроллеры в AngularJS

angular.module('ecosystemServices', []) 
.factory('Guard', function($http, $rootScope) { 
    var permissions = []; 
    return { 

     ready: function() { 
      if (permissions.length == 0) { 
       $http.get('/api/users/own-permissions') 
        .success(function(data){ 
         permissions = data.user_permissions; 
         $rootScope.$broadcast('permissionsReady', 1); 
       }); 
      } else { 
       $rootScope.$broadcast('permissionsReady', 1); 
      } 

      return true; 
     } 
    } 
}) 

я должен ждать, пока не будут загружены разрешения начать делать запросы, поэтому я выполняя передачу на контроллер, который выглядит примерно так:

appControllers.controller('AgencyPanelCtrl', ['$rootScope', '$scope', '$location', '$routeParams', '$http','Guard', 
function ($rootScope, $scope, $location, $routeParams, $http, Guard) { 

    $scope.loading = true; 


    Guard.ready(); 

    $scope.has_permission = function(permission) { 
     return Guard.can(permission); 
    } 

    $rootScope.$on('permissionsReady', function(event, ready) { 
     $scope.initialize(); 
    }); 


    $scope.initialize = function() { 
     console.log("Initialized"); 
    } 

}]); 

это работает, но если я изменить контроллер и сделать то же самое (изменить вид и изменить контроллер), широковещательные прибывающие к старому контроллеру ,

Кто-нибудь знает почему? Или как это исправить?

ответ

1

Вы определяете слушателя событий на $rootScope. Как следует из названия, существует только один $rootScope, и он находится в самом начале документа.

Таким образом, когда ваш вид меняется, а старый контроллер больше не уместен, у $rootScope все еще есть слушатель, который по-прежнему содержит ссылку на старый контроллер $scope через закрытие, и, следовательно, все по-прежнему идет на старый контроллер ,

Вместо этого, вы должны определить слушателя на $scope контроллера:

$scope.$on('permissionsReady', function(event, ready) { 
    $scope.initialize(); 
}); 

Это должно исправить вашу проблему.

+0

Правильно, я сделал это сейчас. Теперь он не транслируется на старый контроллер, но он вообще не транслируется (линия широковещания выполняется, но она не приходит к закрытию $. Это работает в первый раз, хотя и только один раз. что не имеет значения, вернусь ли я к просмотру, который работал в первый раз, он больше не работает, если я не перезагружу страницу. –

+0

Он транслирует, но что-то нужно слушать. Если этот контроллер не является " t активен, тогда ничего не слушает ... у вас есть другой прослушиватель, определенный в другом месте? –

+0

Второй контроллер очень похож, а также имеет $ на куске кода. Должен ли я сделать что-то большее? Когда я создаю экземпляр второго контроллера, первая строка (до $ on) - это вызов, который запускает трансляцию. Делаю ли я что-то не так? –

Смежные вопросы