2016-05-09 11 views
2

である必要があります、私はテンプレートをロードする前に何かを確認するために、この状態に入るときに私が欲しい「invocables」私は、次のような状態を持っているオブジェクト

.state('core.recover', { 
    url: '/recover', 
    controller: 'RecoverPasswordCtrl', 
    templateUrl: 'views/tmpl/recoverAccount/recover-password.html' 
}) 

この場合には、私はそのAPIを呼び出したいです何かをチェックすると、それが成功するとテンプレートが表示され、それ以外の場合は別の状態にリダイレクトされます。

私は、コントローラの上にこれを実行しようとしましたが、私はいつも一瞬のテンプレートを参照してください、それは私をリダイレクトするので、私はこの記事のように決意を使用しようとしました:

AngularJS | handle routing before they load

として、次

.state('core.recover', { 
     url: '/recover', 
     controller: 'RecoverPasswordCtrl', 
     resolve: function(recoverAccountService, $location, $state, $q) { 
      var deferred = $q.defer(); 
      deferred.resolve(); 
      recoverAccountService.get({email:$location.search().email, verificationKey:$location.search().verificationKey}) 
      .$promise.then(function (result) {}).catch(function (err) { 
      $state.go("candidature.pre"); 
      }); 
      return deferred.promise; 
     }, 
     templateUrl: 'views/tmpl/recoverAccount/recover-password.html' 
     }) 

が、それはうまくいきませんでしたし、私は、ブラウザのコンソールでこのエラーを取得しています:

Error: 'invocables' must be an object 

どうすればこの問題を解決できますか?

答えて

1

正しい構文を使用していません。uiRouterは、resolveのエントリとして、評価しようとしているオブジェクトを想定しています。

は、もちろん

var aimadResolver = function(recoverAccountService, $location, $state, $q) { 
    var deferred = $q.defer(); 
    deferred.resolve(); 
    recoverAccountService.get({ email: $location.search().email, verificationKey: $location.search().verificationKey }) 
     .$promise.then(function(result) {}).catch(function(err) { 
      $state.go("candidature.pre"); 
     }); 
    return deferred.promise; 
} 

こと、aimadResolverとしてあなたの解決機能を省略できます、これは必須ではありませんが、私は読みやすさのためにそれをやっています。その後、次のようにあなたの状態の定義は次のようになります。

state('core.recover', { 
    url: '/recover', 
    controller: 'RecoverPasswordCtrl', 
    resolve: {'yourResolverName': aimaidResolver} 
    }, 
    templateUrl: 'views/tmpl/recoverAccount/recover-password.html' 
}) 

RecoverPasswordCtrlyourResolverNameを注入することを忘れないでください、さもなければ、あなたのコントローラは、とにかく待たずにインスタンス化されます。出典:側 でlook for the resolve examples

私は、繰延オブジェクトの使用は意味がないことを指摘したいと思います。ファンクション内の2行目で遅延オブジェクトを即座に解決しています。つまり、がすでにインスタンス化されている間に、recoverAccountservice.get()が保留中である可能性があります。 recoverAccountservice.get()は約束を返します(とそうでない場合、あなたはそのようなことがないことを変更する必要があります)と仮定すると、あなたがより効率的に書くことができます。deferred$q.when()の使用上の

var aimadResolver = function(recoverAccountService, $location, $state, $q) { 
    return recoverAccountService.get({... }) 
     .then(function(result) { 
      // do nothing? Apparently you only want to $state.go on a rejection of the promise 
     }) 
     .catch(function(err) { 
      $state.go("candidature.pre"); 
      return $q.when() 
     }) 
} 

もっとhereを見つけることができます。

関連する問題