2016-11-03 4 views
1

角度設定内で解決方法があります。それは不正なアクセスからビューを保護するために書かれています。問題は、別のルートファイルを作成すると、各ファイルに同じ解決方法をコピーする必要があることです。私はそれを一度書くことができ、それをどこでも使うことができるように、他の方法はありますか?グローバルに使用するリファクタリング角度ui-routerリゾルバ

(function(){ 

'use strict'; 

var app = angular.module('app'); 

app.config(/* @ngInject */ function($stateProvider, $urlRouterProvider) { 

    var authenticated = ['$q', 'MeHelper', '$state', function ($q, MeHelper, $state) { 
     var deferred = $q.defer(); 
     MeHelper.ready() 
      .then(function (me) { 
       if (me.isAuthenticated()) { 
        deferred.resolve(); 
       } else { 
        deferred.reject(); 
        $state.go('login'); 
       } 
      }); 
     return deferred.promise; 
    }]; 

    $stateProvider 
     .state('index', { 
      url: "", 
      views: { 
       "FullContentView": { templateUrl: "start.html" } 
      } 
     }) 
     .state('dashboard', { 
      url: "/dashboard", 
      views: { 
       "FullContentView": { templateUrl: "dashboard/dashboard.html" } 
      }, 
      resolve: { 
       authenticated: authenticated 
      } 
     }) 
     $urlRouterProvider.otherwise('/404'); 

    }); 

})(); 

編集:MeHelperはサービスです。

+0

あなたは 'authenticationProvider'のようなものを作成し、そこに入れてもらえますか? – plong0

+0

@ plong0 authenticationProviderを作成しようとしましたが、それを動作させることができませんでした。 MeHelperと$ stateの注入はプロバイダでは機能しませんでした。 –

答えて

3

app.run(function ($rootScope, $state) { 
 
     $rootScope.$on('$locationChangeSuccess', function() { 
 
     if (unauthorized && $state.current.name !== 'login') { 
 
      $state.go('login'); 
 
     } 
 
     }); 
 
    });

は、あなたのコードをリファクタリングするために、あなたは サービスを登録し、サービスに認証コードを取る必要があります。

認証サービス:

app.factory('authenticateService', ['$q', 'MeHelper', 
    function($q,MeHelper){ 

     var obj = {}; 

     obj.check_authentication = function(params) 
     { 
      var deferred = $q.defer(); 
      MeHelper.ready() 
       .then(function (me) { 
        if (me.isAuthenticated()) { 
         deferred.resolve(); 
        } else { 
         deferred.reject(); 
         $state.go('login'); 
        } 
       }); 
      return deferred.promise; 

     } 


     return obj; 
    } 
]); 

その後、依存性注入や関数パラメータにこのサービス名を取って、解決のいずれかのルートファイルでこのサービスを使用し、

ルート設定ファイル:

(function(){ 

'use strict'; 

var app = angular.module('app'); 

app.config(/* @ngInject */ function($stateProvider, $urlRouterProvider) { 


    $stateProvider 
     .state('index', { 
      url: "", 
      views: { 
       "FullContentView": { templateUrl: "start.html" } 
      } 
     }) 
     .state('dashboard', { 
      url: "/dashboard", 
      views: { 
       "FullContentView": { templateUrl: "dashboard/dashboard.html" } 
      }, 
      resolve: { 
       authenticated: 
         function(authenticateService) { 
           return authenticateService.check_authentication(); 
         } 
      } 
     }) 
     $urlRouterProvider.otherwise('/404'); 

    }); 


})(); 

以下の行を見てください。解決するためにルート設定で変更するもの

サービスは、ラインの下で注入された:

resolve: { 
      authenticated: 
       function(authenticateService) { 
          return authenticateService.check_authentication(); 
        } 
     } 
+0

あなたの答えをありがとう。どのようにサービスを注入できますか? を解決することができますか?{ authenticated:authenticateService.check_authentication(); } –

+1

私のコードを試してみましょう。関数のパラメータで指定された 'authenticateService'は、あなたのためにauthenticateServiceを直接注入します。 – Sravan

+0

あなたは、ui-router解決関数でDI-sytaxを使用できることに注意したい: 'resolve:{ authenticated: ['authenticateService'、function(authenticateService){...}] }' – plong0

0

ルートの変更を確認してください。

+0

サービスコール( 'MeHelper'はサービス)のため、$ rootScopeで動作させることができませんでした。 –

+0

認証されているかどうかを確認するためにルートを変更するたびに、サーバーを呼び出すことは望ましくありません。ログイン後、あなたは認証されていることを保存し、それをチェックするだけです。 –

関連する問題