2016-03-24 12 views
3

私はUI-ルータの状態「に」特定の状態変化を防止するにはどうすればよい(それがフォーカス取得時使用している?)私はこのルートを持っていると仮定すると:防止HTTPクエリに基づいてUI-ルータの状態変化

.state('auth.confirm', { 
    url: '/confirm/:resetToken', 
    template: '<confirm-page></confirm-page>', 
    data: { pageTitle: 'Confirm Reset', specialClass: 'gray-bg' } 
}) 

とこの約束ベースの機能を備えたこのサービス:あなたは適応彼らの例をhttps://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#how-to-create-rules-to-prevent-access-to-a-state

のようにルールを作成することができます

validateResetToken: function(resetToken) { 
    var self = this; 
    var deferred = $q.defer(); 

    $http.post(AppConstants.hostRootUrl + '/auth/reset/validate', { resetToken: resetToken }) 
    .then(function(response) { 
     if(response.data && response.data.success) { 
     // if we got a 200 return and it indicates success in the response, resolve 
     self.message = 'Success'; 
     deferred.resolve(self.message); 
     } 
     else if (response.data && !response.data.success && response.data.error) { 
     // if we got a 200 return, but success is falsey and there's an error message, reject with that message 
     self.message = response.data.error; 
     deferred.reject(self.message); 
     } 
     else { 
     // error with generic message 
     self.message = 'Unknown response. Contact administrator.'; 
     deferred.reject(self.message); 
     } 
    }, function(errPost) { 
     if (errPost.data && errPost.data.error) { 
     self.message = errPost.data.error; 
     deferred.reject(self.message); 
     } 
     else { 
     self.message = 'Could not connect.'; 
     deferred.reject(self.message); 
     } 
    }); 

    return deferred.promise; 
}, 
+0

あなたは[解決](http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$からそれを行うことができます'validateResetToken'から約束したreturendを拒否することができるため、' onEnter'からではなく、状態の変更を中止します(https://github.com/angular-ui/ui-router/wiki#resolve) –

+0

私はそれを試みました、多分私は間違ったことをしていましたが、拒絶は州の変化を防ぐようには見えませんでしたか? – alphadogg

+0

私の問題は私が '解決したことだったと思います:... return AuthService.validateResetToken($ stateParams.resetToken).catch(function(){toastr.error(); return null;}); ...私はそれで何かをする拒絶反応をキャッチしていた。私はnullを返すことはreject()を返すことと同じであると仮定しました。 – alphadogg

答えて

3

は後世(Google社員)ために、アロンエイタンは私resolveアプローチにおける第二を見て作られた、と私はcatch()の私の追加が拒否約束がアップ浸透しないように引き起こしていたことに気づきました。この最終的なコードは動作します:

.state('auth.confirm', { 
     url: '/confirm/:resetToken', 
     template: '<confirm-page></confirm-page>', 
     data: { pageTitle: 'Confirm Reset', specialClass: 'gray-bg' }, 
     resolve: { 
     validated: function($q, $stateParams, AuthService, toastr) { 
      //$log.log('auth.confirm resolve $stateParams',$stateParams); 
      return AuthService.validateResetToken($stateParams.resetToken).catch(function(validateErr) { 
      toastr.error(validateErr, 'Blocked', {closeButton: true}); 
      return $q.reject(validateErr); 
      }); 
     } 
     } 
    }) 
0

app.config(function($stateProvider) { 
    $stateProvider.state('privatePage', { 
    data: { 
     rule: function(token) { 
     return validateResetToken(token) 
     } 
    }); 
}); 
app.run(function($rootScope, $state, $stateParams) { 
    $rootScope.$on('$stateChangeStart', function(e, to) { 
    if (!angular.isFunction(to.data.rule)) return; 
    var result = to.data.rule($stateParams.resetToken); 

    if (result && result.to) { 
     e.preventDefault(); 
     // Optionally set option.notify to false if you don't want 
     // to retrigger another $stateChangeStart event 
     $state.go(result.to, result.params, {notify: false}); 
    } 
    }); 
}); 
関連する問題