2014-11-22 2 views
8

Я пытаюсь использовать $stateChangeStart с ui-маршрутизатором в контроллере. Кажется, что каждый раз, когда он уволен, обратный вызов срабатывает +1 раз больше, чем в прошлый раз.stateChangeStart триггер несколько раз

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){ 
    console.log('$stateChangeStart'); 
}); 

Например, при первом старте смены console.log будет выпущен один раз. второй раз console.log будет выпущен дважды, и т. д.

Я знаю, что использование event.preventDefault() остановит это поведение, но оно также остановит все поведенческие действия, и это не является реалистичным решением для меня.

У меня есть решение, хотя я чувствую, что может быть более умный способ справиться с этим:

var stateChangeStarted = false; 
$rootScope.$on('$stateChangeStart', function(event){ 
    if(!stateChangeStarted) { 
     stateChangeStarted = true; 
     console.log('$stateChangeStart'); 
    } 
}); 

Кто-нибудь есть какие-либо идеи, почему это происходит и что еще я могу сделать, чтобы предотвратить это?

ответ

15

Ваш контроллер создается при помощи ui-router при каждом входе в состояние, с которым оно связано. Поэтому ваш звонок $rootScope.$on будет добавлять нового слушателя к событию $stateChangeStart каждый раз, когда вы вводите это состояние.

Если вам нужно обработать событие только один экземпляр диспетчера, вы можете сохранить функцию регистрации, которую возвращает $rootScope.$on и выполнить ее из обратного вызова прослушивателя.

var deregisterStateChangeStart = $rootScope.$on('$stateChangeStart', function (event) { 
    // Do something here. 

    deregisterStateChangeStart(); 
}); 
+0

Если вы находитесь в том же контроллере, идущем от одного URL-адреса штата к другому URL-адресу штата, это состояниеChangeStart только срабатывает один раз. – duyn9uyen

4

Очистить слушателей от stateChangeStart в начале вашего контроллера.

$rootScope.$$listeners.$stateChangeStart = []; 
+0

thanks.it работает для меня. – Murali