2015-01-15 6 views
0

Я пытаюсь включить $firebaseAuth в свой Ионный проект. Я использовал примерный пример, войдя в систему с Twitter (auth.$authWithOAuthPopup('twitter')), с Firebase website и включил его в мою Ionic Framework. Код показан ниже.Аутентификация Firebase «липкая» в Ionic

Я использую следующие версии (все в курсе, как сегодня): firebase 2.0.4 angularfire 0.9.1 ионным 1.0.0-beta.14 "магниево-мангуст"

Кликнув на кнопке «Вход» правильно открывается всплывающее окно, и я могу войти в систему. После этого, однако, в проекте Ionic ничего не изменилось, в то время как на самом деле вошло в систему. Когда я обновляю свой браузер, он показывает мое отображаемое имя, а также уведомляет меня о том, что я правильно зарегистрирован.

У меня было то же самое «липкость» при попытке включить аутентификацию ui-router Firebase, а также копирование кода с веб-сайта. Более того, я должен был обновить изменения для обработки.

Почему эта задержка? Разве firebase не должна быть в режиме реального времени? Я предполагаю, что он должен что-то сделать с настройками Ionic, так как использование Angularfire-seed (без ионического) отлично работает. Или, может быть, это что-то еще?

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', 'firebase', 'starter.controllers', 'starter.services']) 

.run(function($ionicPlatform) { 
    $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(); 
    } 
    }); 
}) 

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

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

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

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

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

}); 

services.js

angular.module('starter.services', []) 

// let's create a re-usable factory that generates the $firebaseAuth instance 
.factory("Auth", ["$firebaseAuth", function($firebaseAuth) { 
    var ref = new Firebase("https://cloakit.firebaseio.com/"); 
    return $firebaseAuth(ref); 
}]) 

controllers.js

// other controllers 

// AccountCtrl 
.controller("AccountCtrl", ["$scope", "Auth", function($scope, Auth) { 
    $scope.settings = { 
    enableFriends: true 
    }; 

    $scope.auth = Auth; 
    $scope.user = $scope.auth.$getAuth(); 
}]); 

закладки account.html

<ion-view view-title="Account"> 
    <ion-content> 
    <ion-list> 
     <ion-item class="item-toggle"> 
     Enable Friends 
     <label class="toggle"> 
      <input type="checkbox" ng-model="settings.enableFriends"> 
      <div class="track"> 
      <div class="handle"></div> 
      </div> 
     </label> 
     </ion-item> 
     <ion-item> 
     <div ng-show="user"> 
     <p>Hello, {{ user.twitter.displayName }}</p> 
     <button ng-click="auth.$unauth()">Logout</button> 
    </div> 
    <div ng-hide="user"> 
     <p>Welcome, please log in.</p> 
     <button ng-click="auth.$authWithOAuthPopup('twitter')">Login</button> 
    </div> 
     </ion-item> 
    </ion-list> 
    </ion-content> 
</ion-view> 

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 js --> 
    <script src="lib/firebase/firebase.js"></script> 
    <script src="lib/firebase/angularfire/angularfire.min.js"></script> 

    <!-- loading bar --> 
    <script src="lib/angular-loading-bar/src/loading-bar.js"></script> 
    <link href='lib/angular-loading-bar/src/loading-bar.css' rel='stylesheet' /> 


    <!-- 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></ion-nav-view> 
    </body> 
</html> 

ответ

3

Вы можете take a look at $onAuth.

$ onAuth Слушает изменения состояния аутентификации клиента.

Так что ваш код будет выглядеть следующим образом:

$scope.auth = Auth; 

var authData = $scope.auth.$getAuth(); 

$scope.auth.$onAuth(function(authData) { 
    if (authData) { 
     $scope.user = authData 
    } else { 
     console.error("Could not retrieve user"); 
    } 
}); 

Вам может понадобиться запустить $scope.$apply(). Я думаю, что вы не будете с тех пор, как $ firebase должна находиться внутри цикла Angulars digest, но я бы бросил туда, если он все еще не работает, чтобы убедиться, что он вам не нужен.

Смежные вопросы