0

Может кто-нибудь объяснить мне, почему Angular UI Router Extras дополнение триггера дважды (инициализация!) $stateChangeStart события в случае, когда у меня есть некоторые проверки асинхронного АЯКСА и e.preventDefault() вызова?

Короткий код события Пример:

$rootScope.$on("$stateChangeStart", function (e, toState, toParams, fromState, fromParams, error) { 
     console.log("$stateChangeStart");//fired twice 
     if(!User.data) { 
      e.preventDefault(); 
      $http.get("https://randomuser.me/api/") 
      .success(function(data, status, headers, config) { 
        console.log(data); 
        User.data = data; 
        $state.go(toState, toParams); 
       }); 
     }    
}); 

Full FIDDLE Example

Без статистов капельной все работает, как ожидалось.

TNX

+0

удалить 'e.preventDefault();' – Ronnie

+0

Тогда изменение состояния в успех обратного вызова никогда не выполняется – Vlatko

+0

триггеров один раз, вы предотвратить это, потому что данные не вернулся .... вы поменяете и пожары снова. Было бы намного лучше сделать этот вызов api в разрешении основного состояния приложения. – charlietfl

ответ

0

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

Вы можете видеть это поведение во время $ watch.

$scope.$watch('myVariable', function(change){ 
    if(!change){ return; } 
    // do important things here. 
}); 

В ходе первого раунда дайджест изменений параметра придет как неопределенных, пока MYVARIABLE не установлено где-то в другом месте. После того, как myVariable настроен на одежде, часы $ будут снова стрелять и прорваться через блок if, чтобы выполнить какую-то реальную работу.

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

$rootScope.$on("$stateChangeStart", function (e, toState, toParams, fromState, fromParams, error) { 

    if(!e || !toStateForExample || anotherParameter){ return; } 

    console.log("$stateChangeStart");//fired twice 
    if(!User.data) { 
    e.preventDefault(); 
    $http.get("https://randomuser.me/api/") 
    .success(function(data, status, headers, config) { 
     console.log(data); 
     User.data = data; 
     $state.go(toState, toParams); 
    }); 
    }    
}); 
+0

Я думаю, что должно существовать более элегантное решение, чтобы исправить это. Это дополнение добавляет иногда действительно багги. – Vlatko

+0

Попробуйте сначала, посмотрите, правильная ли мысль, а затем рефакторинг, соответствующий вашей элегантности. – SoEzPz