2015-01-12 29 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

嗨Himmet。说实话,我不知道,我认为是Ionic Framework的标准配置。是的,请分享你的方法! – AMG

+0

我能够获得接受的工作答案。我的代码中的一个区别是,我将'authRequired'作为状态的一个属性,而不是嵌套在状态的视图中。否则,在我看来,你需要修改'toState.authRequire'来检查toState.view内部 – 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事件处理程序必须放置在初始化离子的运行函数中。运行函数是最接近角度的主要方法,它会在应用程序加载时执行。我更新了代码 – Karthik

+0

感谢您的更新。它似乎没有为我工作,因为我有.config中的我的状态。 AuthService是Auth? – AMG

0

要使用成功读取值:

toState.authRequired 

请将authRequired: true内的.state,而不是views

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') 

}); 
相关问题