0

私は$rootScopeを使用して、現在ログインしているユーザーに常にアクセスしています。ユーザーが新しい食事をシステムに提出すると、食事の属性に加えてユーザーのIDが保存されます。

これはうまくいきますが、私はブラウザをハードにリフレッシュすると、$rootScope.userオブジェクトが消えます。

どうすればいいですか?

私が持っている app.js

:ユーザーは、我々が持っているAddCtrl内、AddMealページにアクセスした場合、その後

Auth.$onAuth(function (user) { 
       if (user === null) { 
        console.log("Not logged in yet"); 
       } else { 
        console.log("Logged in as", user.uid); 
       } 
       $rootScope.user = user; 
     }); 

$rootScope.user;

はここで時にユーザがログインを何が起こるかです:

var firebaseObj = new Firebase("https://myapp.firebaseio.com/courses/"); 
    var fb = $firebaseArray(firebaseObj); 
console.log($rootScope.user) 

$scope.newMeal = { 
    name: "", 
    price: "", 
    ingredients: "", 
    description: "", 
    category: "", 
    cuisine: "", 
    userID:"" 
}; 

$scope.submitMeal = function() { 
    if (angular.equals({}, $scope.newMeal)) { 
     alert("Your form is empty"); 
     $rootScope.notify('Your form is empty') 
    } else { 
     console.log($scope.newMeal); 
     var name = $scope.newMeal.name; 
     var price = $scope.newMeal.price; 
     var ingredients= $scope.newMeal.ingredients; 
     var description = $scope.newMeal.description; 
     var category= $scope.newMeal.category; 
     var cuisine= $scope.newMeal.cuisine; 

     fb.$add({ 
      name: name, 
      price: price, 
      ingredients: ingredients, 
      description: description, 
      category: category, 
      cuisine: cuisine, 
      userID: $rootScope.user.uid 
     }).then(function(ref) { 
      $scope.newMeal = {}; 
      console.log(ref); 
     }, function(error) { 
      console.log("Error:", error); 
     }); 

     $rootScope.notify('New meal has been added!') 
    } 

ここapp.jsで私run機能である:

.run(function ($ionicPlatform, $rootScope, $firebaseAuth, $firebase, $window, $ionicLoading) { 
     $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); 
       cordova.plugins.Keyboard.disableScroll(true); 

      } 
      if (window.StatusBar) { 
       // org.apache.cordova.statusbar required 
       StatusBar.styleDefault(); 
      } 

      $rootScope.show = function(text) { 
       $rootScope.loading = $ionicLoading.show({ 
        content: text ? text : 'Loading..', 
        animation: 'fade-in', 
        showBackdrop: true, 
        maxWidth: 200, 
        showDelay: 0 
       }); 
      }; 

      $rootScope.hide = function() { 
       $ionicLoading.hide(); 
      }; 

      $rootScope.notify = function(text) { 
       $rootScope.show(text); 
       $window.setTimeout(function() { 
        $rootScope.hide(); 
       }, 1999); 
      }; 

      $rootScope.user; 

     }); 
    }) 
+0

sessionStorageを使用してユーザートークンを保存し、ユーザーがこれまでのページにログオンしているかどうかを確認できます。 – charlietfl

答えて

1

AngularJSはSPA(hereあなたはそれについて少し読むことができる)として動作します。要点は、ページがリロードされたときに、他のSPAと同じように、すべてのデータが失われ、アプリが再読み込みされるということです。このため、この問題が発生しています。 アプリがロード/リロードされると、app.config()に移動し、app.run()(存在する場合)に移動した後、リジッドに移動します。 私の解決方法は、ユーザーの情報データをlocalstorage(cookieのように動作する)に保存してから、アプリケーションの初期化時にその情報を尋ねることです。

angular.module('MyApp').run(function($rootScope){ 
    if(!angular.isDefined($rootScope.userInfo) && localstorage.userInfo){ 
     // UserInfo exists in localstorate but not on $rootScope. This means the page was reloaded or the user is returning. 
     $rootScope.userInfo = localstorage.userInfo; 
    }else if(!angular.isDefined($rootScope.userInfo) && !localstorage.userInfo){ 
     // User is not logged at all. Send him back to login page 
    }else if(angular.isDefined($rootScope.userInfo)){ 
     // User is logged in. You can run some extra validations in here. 
    } 
}); 

私はあなたが言われて、変数$rootScope.userInfo

上のユーザー情報を保持すると仮定しています、私は強くあなたが$ rootScopeではなく、あなたのデータを保持するためにサービスを試してみてくださいお勧めします。 Here'sあなたがそれを達成する方法についてのガイド。

これがあなたの問題を解決することを願っています。あなたはイオン性で作業している場合は

** UPDATE

あなたはこのような何かを試すことができます。

var myApp = angular.module('myApp', ['ionic']); 
    myApp.run(function($ionicPlatform) { 
     $ionicPlatform.ready(function() { 
     //load your settings from localStorage or DB where you saved. 
    }); 
}); 

この referenceからそれを取りました。

+0

こんにちはジェラルド、私はこれを行っていきます!ちょうどFYI、私は最初にユーザーを得るためにサービスを使用しようとしていた - 私が掲示したこの質問を参照してください - http://stackoverflow.com/questions/36225588/cant-get-firebase-reference-to-id-to-define-現在の使用者。しかし、何らかの理由で、私がサービスから欲しかった項目が、 '$ waitForAuth'の外で、' $ waitForAuth'関数の中ではなく、私のコントローラのconsole.logに現れていることがわかりました。 –

+0

グローバルにサービスを維持することは良い方法であると考えられますが、何らかの理由でトラブルが見つかった場合は、常に最適な方法で行くことができます。'$ rootScope'で酷いことはしないでください。あなたのアプリがそれを読むのは難しくなります。 –

+0

こんにちは@Gerardo、私はあなたに合うように私のコードを適合させることができ、 '$ ionicPlatform.ready()'のようなものを動揺させたくないので 'run'関数のコードをどこでリファクタリングするかを理解しようとしていました。これについてあなたの答えを調整してもよろしいですか? –

関連する問題