0

非同期の ajax チェックと呼び出しがある場合に、 Angular UI Router Extrasの追加が 2 回 (init で!) イベントをトリガーする理由を説明してもらえますか?$stateChangeStarte.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);
              });
       }              
 });

完全な FIDDLE の例

エクストラを追加しなくても、すべてが期待どおりに機能しています。

TNX

4

1 に答える 1

0

Angularjs は、ダイジェスト サイクル中に複数のチェックを行って、変更の前後をチェックします。これは、そのサイクルの一部である可能性があります。

$watch 中にこの動作を確認できます。

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

ダイジェストの最初のラウンドでは、myVariableが別の場所に設定されるまで、変更パラメーターはundefinedとして入ります。myVariableが else-wear に設定されると、$watch が再び起動し、if ブロックを突破して実際の作業を行います。

関数がこれに該当する場合は、ifブロックを追加して、1 つ以上のパラメーターが定義されていない場合、または実行する必要のない値がある場合に返すことができます。

$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);
    });
   }              
 });
于 2015-07-21T22:07:17.470 に答える