2015-01-12 12 views
17

私はIonicでアプリケーションを構築しており、Firebase認証方式を掘り下げ始めました。これまでのところ、私はTwitter経由でログインを正しく設定できました(私はログインとログアウトができます)。ログイン時の状態の処理方法(Ionic、Firebase、AngularJS)?

しかし、ログインしたときに特定の状態(したがってページ)のみが表示されるようにイオンフレームワークの状態を設定するにはどうすればよいですか?私がこれまでに持っていたコードを以下に示します。

AuthRequired: true 

あなたがこれを行うとか、それは何と呼ばれている方法:

は、理想的には私は変数のようなものを持っているでしょうか?

app.js

// Ionic Starter App 

// angular.module is a global place for creating, registering and retrieving Angular modules 
// 'starter' is the name of this angular module example (also set in a <body> attribute in index.html) 
// the 2nd parameter is an array of 'requires' 
// 'starter.services' is found in services.js 
// 'starter.controllers' is found in controllers.js 
angular.module('starter', ['ionic', 'ngCordova', 'firebase', 'firebase.utils', 'starter.controllers', 'starter.services', 'starter.config', 'starter.auth']) 

.run(function($ionicPlatform, Auth, $rootScope) { 


    $ionicPlatform.ready(function() { 
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 
    // for form inputs) 
    if (window.cordova && window.cordova.plugins.Keyboard) { 
     cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
    } 
    if (window.StatusBar) { 
     // org.apache.cordova.statusbar required 
     StatusBar.styleDefault(); 
    } 
    }); 



    //stateChange event 
    $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams){ 
     if (toState.authRequired && !Auth.isAuthenticated()){ //Assuming the AuthService holds authentication logic 
     // User isn’t authenticated 
     $state.transitionTo("login"); 
     event.preventDefault(); 
     } 
    }); 





}) 

.config(function($stateProvider, $urlRouterProvider) { 

    // Ionic uses AngularUI Router which uses the concept of states 
    // Learn more here: https://github.com/angular-ui/ui-router 
    // Set up the various states which the app can be in. 
    // Each state's controller can be found in controllers.js 
    $stateProvider 

    // setup an abstract state for the tabs directive 
    .state('tab', { 
    url: "/tab", 
    abstract: true, 
    templateUrl: "templates/tabs.html" 
    }) 

    // Each tab has its own nav history stack: 

    .state('tab.dash', { 
    url: '/dash', 
    views: { 
     'tab-dash': { 
     templateUrl: 'templates/tab-dash.html', 
     controller: 'DashCtrl', 
     authRequired: true 
     }, 
    } 
    }) 

    .state('tab.chats', { 
     url: '/chats', 
     views: { 
     'tab-chats': { 
      templateUrl: 'templates/tab-chats.html', 
      controller: 'ChatsCtrl', 
      authRequired: true 
     } 
     } 
    }) 
    .state('tab.chat-detail', { 
     url: '/chats/:chatId', 
     views: { 
     'tab-chats': { 
      templateUrl: 'templates/chat-detail.html', 
      controller: 'ChatDetailCtrl', 
      authRequired: true 
     } 
     } 
    }) 

    .state('tab.friends', { 
     url: '/friends', 
     views: { 
     'tab-friends': { 
      templateUrl: 'templates/tab-friends.html', 
      controller: 'FriendsCtrl', 
      authRequired: true 
     } 
     } 
    }) 
    .state('tab.friend-detail', { 
     url: '/friend/:friendId', 
     views: { 
     'tab-friends': { 
      templateUrl: 'templates/friend-detail.html', 
      controller: 'FriendDetailCtrl', 
      authRequired: true 
     } 
     } 
    }) 

    .state('tab.account', { 
    url: '/account', 
    views: { 
     'tab-account': { 
     templateUrl: 'templates/tab-account.html', 
     controller: 'AccountCtrl', 
      authRequired: true 
     } 
    } 
    }) 

    .state('tab.example', { 
    url: '/example', 
    views: { 
     'tab-example': { 
     templateUrl: 'templates/tab-example.html', 
     controller: 'ExampleCtrl', 
      authRequired: true 
     } 
    } 
    }) 


    .state('tab.overview', { 
    url: '/overview', 
    views: { 
     'tab-overview': { 
     templateUrl: 'templates/tab-overview.html', 
     controller: 'OverviewCtrl', 
      authRequired: true 
     } 
    } 
    }) 

    .state('tab.login', { 
    url: '/login', 
    views: { 
     'tab-login': { 
     templateUrl: 'templates/tab-login.html', 
     controller: 'LoginCtrl', 
      authRequired: true 
     } 
    } 
    }); 

    // if none of the above states are matched, use this as the fallback 
    $urlRouterProvider.otherwise('/tab/dash'); 

}) 

index.htmlを

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"> 
    <title></title> 

    <link href="lib/ionic/css/ionic.css" rel="stylesheet"> 
    <link href="css/style.css" rel="stylesheet"> 

    <!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above 
    <link href="css/ionic.app.css" rel="stylesheet"> 
    --> 

    <!-- ionic/angularjs js --> 
    <script src="lib/ionic/js/ionic.bundle.js"></script> 


    <!-- firebase and simple login --> 
    <script src="https://cdn.firebase.com/libs/angularfire/0.9.1/angularfire.min.js"></script> 
    <script src="https://cdn.firebase.com/js/client/2.0.4/firebase.js"></script> 


    <!-- cordova script (this will be a 404 during development) --> 
    <script src="lib/ngCordova/dist/ng-cordova.js"></script> 
    <script src="cordova.js"></script> 

    <!-- your app's js --> 
    <script src="js/app.js"></script> 
    <script src="js/controllers.js"></script> 
    <script src="js/services.js"></script> 



    </head> 
    <body ng-app="starter"> 
    <!-- 
     The nav bar that will be updated as we navigate between views. 
    --> 
    <ion-nav-bar class="bar-stable"> 
     <ion-nav-back-button> 
     </ion-nav-back-button> 
    </ion-nav-bar> 
    <!-- 
     The views will be rendered in the <ion-nav-view> directive below 
     Templates are in the /templates folder (but you could also 
     have templates inline in this html file if you'd like). 


    --> 

    <ion-nav-view animation="slide-left-right"></ion-nav-view> 



    </body> 
</html> 
+0

あなたはUIルータまたは公式ngRouterを使用していますか?私自身は、uiルータを使用し、各状態で、対応する状態に認証が必要かどうかを判断する "public"というブール値のようなカスタムデータを保存することができます。私は、あなたがそのようなものを望むならば、より詳細な情報を与えることができます。 –

+0

こんにちは。正直言って私は知らない、私はイオンフレームワークに付属する標準的なものと思う。はい、あなたの方法を共有してください! – AMG

+0

私は仕事で受け入れられる答えを得ることができます。私のコードの1つの違いは、私は状態のプロパティとして 'authRequired'を持っていて、状態のビューに入れ子になっていないことです。それ以外の場合は、toState.viewの内部をチェックするために 'toState.authRequire'を変更する必要があることがわかりました。 – liampronan

答えて

15

あなたはほとんどそこにあります。あなたが必要とするのは、あなたの州に適切なマークが付けられていることを確認することです(AuthRequiredのカスタムプロパティで$ stateChangeStartイベントを待ちます)。このイベントは、アプリケーションで移動するたびに発生します。

.run(function($ionicPlatform, AuthService) { 
     //ionic init code  

     //stateChange event 
     $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams){ 
     if (toState.authRequired && !AuthService.isAuthenticated()){ //Assuming the AuthService holds authentication logic 
     // User isn’t authenticated 
     $state.transitionTo("login"); 
     event.preventDefault(); 
     } 
    }); 
} 

.state('tab.dash', { 
    url: '/dash', 
    views: { 
     'tab-dash': { 
     templateUrl: 'templates/tab-dash.html', 
     controller: 'DashCtrl', 
     authRequired: true 
     } 
    } 
    }) 

    .state('tab.chats', { 
     url: '/chats', 
     views: { 
     'tab-chats': { 
      templateUrl: 'templates/tab-chats.html', 
      controller: 'ChatsCtrl', 
      authRequired: true 
     } 
     } 
    }) 

$ stateChangeStartイベントハンドラを持つのに最適な場所は、アプリケーションの実行です。使用して値を読んで成功するために

+0

答えをありがとう。私は正確にどこでどのようにstateChangeStartを置くのか分かりませんか? – AMG

+0

@AMG stateChangeイベントハンドラは、イオンを初期化する実行関数に配置する必要があります。 run関数は、angleのmainメソッドに最も近く、appがロードされたときに実行されます。あなたのためにコードを更新しました – Karthik

+0

更新いただきありがとうございます。 .configファイルに自分の状態があるので、私にとってはうまくいかないようです。 AuthServiceはAuthですか? – AMG

0

toState.authRequired 

.state代わりにviewsauthRequired: true内部を移動してください。

2

私はあなたと同じ問題を抱えていました!私はそれをどのように解決したか見てみましょう!

app.js

angular.module('app', ['ionic','firebase', 'app.controllers', 'app.routes', 'app.directives','app.services','app.filters',]) 

.run(function($ionicPlatform, $rootScope, $state) { 
    $ionicPlatform.ready(function() { 
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 
    // for form inputs) 
    if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) { 
     cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
     cordova.plugins.Keyboard.disableScroll(true); 
    } 
    if (window.StatusBar) {// 
     // org.apache.cordova.statusbar required 
     StatusBar.styleDefault(); 
    } 
    }); 

    //stateChange event 
    $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams){ 
    var user = firebase.auth().currentUser; 
    if (toState.authRequired && !user){ //Assuming the AuthService holds authentication logic 
     // User isn’t authenticated 
     $state.transitionTo("login"); 
     event.preventDefault(); 
    } 
    }); 
    // Initialize Firebase Here 

}) 

routes.js

angular.module('app.routes', ['ionicUIRouter']) 

.config(function($stateProvider, $urlRouterProvider) { 

    $stateProvider 

    .state('login', { 
    url: '/login', 
    templateUrl: 'templates/login.html', 
    controller: 'loginCtrl' 
    }) 

.state('menu', { 
    url: '/menu', 
    templateUrl: 'templates/menu.html', 
    abstract:true, 
    controller: 'menuCtrl' 
    }) 

    .state('menu.dash', { 
    url: '/contas', 
    templateUrl: 'templates/dash.html', 
    controller: 'contasCtrl', 
    authRequired: true 
    }) 

$urlRouterProvider.otherwise('/login') 

}); 
関連する問題