0

AngularJS (私は初心者です) では、ルーティング中に拒否された約束をどのように「解決」できますか?

私のアプリでは、すべての訪問者が匿名で、または資格情報を指定して認証される必要があります。私は Firebase と AngularFire を使用しています。

最初に、訪問者が に移動すると、を使用してルーティング中にrouteで認証されているかどうかを確認します。resolve$routeProvider

訪問者が認証されない場合 ( error === 'AUTH_REQUIRED')、promise は拒否されます。次に、ユーザーを匿名で認証します。

promise が拒否されたため、ルートは読み込まcontrollerviewませんでした。

Q:訪問者を匿名で認証した後、どのようにルートのcontrollerとを読み込むことができますか?view

どういうわけかルートをリフレッシュ/リロードできると思いますが、もっと良い方法があると思います。

したがって、認証が必要なルートに移動する認証されていないユーザーの場合 (ほとんどすべてのユーザーがそうします):

  1. 認証が必要です。約束を拒否する
  2. 訪問者を匿名で認証する
  3. 匿名認証が成功しました。訪問者がすでに認証されていた場合と同様に、ルートのcontrollerand (およびその他すべて) をロードします。view

私が理解しているように、すでに拒否された約束を解決することはできません。

お役に立てれば幸いです。これを達成するために私が現在行っていることの例を次に示します。

var app = angular.module('vo2App', ['firebase', 'ngRoute']);

app.config(['$routeProvider', function ($routeProvider) {
  $routeProvider
  .when('/', {
    controller: 'HomeCtrl',
    resolve: {
      'currentAuth': ['Auth', function (Auth) {
        return Auth.$requireAuth();
      }]
    },
    templateUrl: './views/home.html'
  })
}]);

app.run(['$rootScope', 'Auth', function ($rootScope, Auth) {
  $rootScope.$on('$routeChangeError', function (event, next, prev, error) {
    if (error === 'AUTH_REQUIRED') {
      console.log('Unauthorized');

      Auth.$authAnonymously().then(function (authData) {
        console.log(authData);
      }).catch(function(error) {
        console.log(error);
      });
    }
  });
}]);

app.controller('HomeCtrl', ['currentAuth', function (currentAuth) {
  console.log(currentAuth);
}]);

app.factory('Auth', ['$firebaseAuth', function ($firebaseAuth) {
  var ref = new Firebase('https://myvo2-mx.firebaseio.com');

  return $firebaseAuth(ref);
}]);
4

1 に答える 1

1

両方が失敗した場合にのみ約束を拒否できるように、Auth.$requireAuth();呼び出さないのはなぜですか。Auth.$authAnonymously()

基本的、

var defer = $q.defer();
Auth.$requireAuth().then(defer.resolve,function(){
   Auth.$authAnonymously().then(defer.resolve,defer.reject)
})
return defer.promise;
于 2015-09-03T12:57:18.430 に答える