web-dev-qa-db-ja.com

$ rootScope.currentUserが更新時にnullになる

FirebaseSimpleLoginを機能させ、現在のユーザーをrootScopeに格納することができました。別のページに移動してフィードページに戻ると、すべてが読み込まれますが、更新すると$ rootScope.currentUserがnullになります。他の誰かがこの問題を抱えていましたか?

私のapp.run関数に次のコードがあります:

$rootScope.$on('$firebaseSimpleLogin:login',function(e, auth){
   $rootScope.currentUser = User.find(auth.id);
});

そして、これはユーザーの投稿を読み込もうとしている私のFeedCtrlです

app.controller('FeedCtrl',['$scope', '$rootScope','User','Auth','Post',function($scope,     $rootScope,User,Auth,Post){
 populateFeed();
 console.log($rootScope.currentUser);

$scope.logout = function(){
   Auth.logout();
};


$scope.savePost = function(){
  Post.create($scope.post).then(function(post){
    $scope.post.text = "";
  });
};

function populateFeed(){
   $scope.posts = {};
   angular.forEach($rootScope.currentUser.posts,function(id){
    $scope.posts[id] = Post.find(id);
   });
}

}]);

私のメインアプリモジュール

var app = angular.module('myapp',['ui.router','firebase']);

app.config(function($stateProvider, $urlRouterProvider){
  $stateProvider
.state('/',{
  url: '/',
  controller: 'MainCtrl',
  templateUrl: 'views/index.html'
})
.state('feed',{
  url: '/feed',
  controller: 'FeedCtrl',
  templateUrl: 'views/feed.html',
  authenticate: true
})
.state('login',{
  url: '/login',
  controller: 'LoginCtrl',
  templateUrl: 'views/login.html'
})
.state('signup',{
  url: '/signup',
  controller: 'LoginCtrl',
  templateUrl: 'views/signup.html'
})
.state('settings',{
  url: '/settings',
  controller: 'SettingsCtrl',
  templateUrl:"views/settings.html"
})
.state('profile',{
  url: '/:slug',
  controller: 'ProfileCtrl',
  templateUrl: 'views/profile.html'
})
.state('profile-about',{
  url: '/:slug/about',
  controller: 'ProfileCtrl',
  templateUrl: 'views/profile.html'
});

$urlRouterProvider.otherwise('/');
})
.constant('FIREBASE_URL','https://{FIREBASE}.firebaseio.com/')
.run(function($rootScope, $state,FIREBASE_URL, $firebaseSimpleLogin, User, Auth){
$rootScope.$on('$stateChangeStart',function(event, next){
  if(next.authenticate && !User.getCurrentUser()){
     $state.go('login');
  }
 });

 $rootScope.$on('$firebaseSimpleLogin:login',function(e, auth){
   $rootScope.currentUser = User.find(auth.id);
  });

 $rootScope.$on('$firebaseSimpleLogin:logout',function(){
  delete $rootScope.currentUser;
  $state.go('login');
 });

 $rootScope.logout = function(){
  Auth.logout();
};

});
18
Markus Gray

「更新」とは、ブラウザでF5を押してメモリから$ rootscopeをワイプし、経験に応じてnullが返されることを意味します(基本的に、アプリ全体が「再起動」されます)。

値を永続化するには、それらをCookieに保存するか、localStorage/sessionStorageを使用する必要があります。たとえば、$ rootscope.currentUserを使用する代わりに、$ window.sessionStorage.currentUserを使用します。

28
lindstromhenrik

これをlocalStorageに格納するには、次のようにします。$ window.localStorage.setItem( "currentUser"、currentUser);

またはjson形式で保存:$ window.localStorage.setItem( "currentUser"、angular.toJson(currentUser));

そこでフォームを取得するには:var currentUser = $ window.localStorage.getItem( "currentUser");

または、2番目の方法で保存した場合:var currentUser = JSON.parse($ window.localStorage.getItem( "currentUser"));

10
A. El Idrissi