2016-04-01 2 views
2

У меня есть довольно прямо вперед, создать две вкладку, дом и администратор

$routeProvider 
      // route for the home page 
      .when('/home', { 
      templateUrl : 'views/home.html', 
      controller : 'myCtrl', 
      controllerAs: 'vm', 
      resolve:{ 
       loadDropDowns:function(DataSvc,$rootScope){ 

         return DataSvc.GetDropDowns(); 

       } 
      } 
     }) 
     // route for admin page 
     .when('/admin',{ 
      templateUrl : 'admin/templates/admin.html'    
     }) 

и в контроллере, у меня есть слушатель за $ viewContentLoaded события как так : $rootScope.$on('$viewContentLoaded', function(event){ console.log(" viewContentLoaded fired "); });

и каждый раз, когда я нажимаю на вкладке дома, обработчик события стрельб дважды так первый раз его 2, чем 4, чем 8, и так далее ...

у меня есть другое событие, транслируемое при загрузке выпадающих списков, а также для одного события с бродкастом, я также получаю несколько сбоев обработчика.

$rootScope.$broadcast('dropDownsSet'); 

и в том же контроллере:

$rootScope.$on('dropDownsSet', function(event, mass) {} 

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

I «В конце концов, что может быть причиной этого безумия?

ответ

2

Переместить событие связывания кода

$rootScope.$on('$viewContentLoaded', function(event){ 
    console.log(" viewContentLoaded fired "); 
}); 

от myCtrl контроллера до некоторого основного приложения (родительский) контроллера. Что происходит сейчас, так это то, что каждый раз, когда вы переходите на вкладку «Главная», создается экземпляр myCtrl, таким образом регистрируя еще один прослушиватель событий на $rootScope.

+0

это большое предложение. Спасибо !! Это родительский контроллер. есть ли способ очистить все остальные события при регистрации нового? – JavaHead

+0

Вы можете удалить обработчики событий (см. Ответ Ved), но я думаю, что лучше спроектировать контроллеры и события, чтобы он не был нужен. – dfsq

+0

Спасибо за вашу помощь, я пытался понять это уже несколько дней. – JavaHead

1
$rootScope.$on('dropDownsSet', function(event, mass) {} 

$rootScope Слушатели событий не уничтожаются ароматически. Вам нужно уничтожить его, используя $ destroy. лучше использовать $scope.$on, так как слушатель на $ scope уничтожается автоматически.

$scope.$on('dropDownsSet', function(event, mass) {} 

Или

var customeEventListener = $rootScope.$on('dropDownsSet', function(event, mass) { 

    } 

$scope.$on('$destroy', function() { 
     customeEventListener(); 
    }); 
+0

Спасибо Ved, это суперхорошо – JavaHead

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