0

Geçerli oturum açmış olan kullanıcıya her zaman erişmek için $rootScope kullanıyorum. Kullanıcı sisteme yeni bir yemek gönderdiğinde, yemek özniteliklerinin yanı sıra onları gönderen kullanıcı kimliğine de kaydedilir.

Bu çalışır, ancak tarayıcımı tazelemediğim an $rootScope.user nesnesi kaybolur.

Bunu nasıl önleyebilirim? app.js yılında

Ben:

$rootScope.user;

Burada kullanıcı günlükleri ne olur: Kullanıcı AddMeal sayfasına erişmeden

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

, AddCtrl içinde biz var:

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

İşte app.js benim run fonksiyonudur:

.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

Bir kullanıcı belirteci saklamak ve kullanıcının oturum açıp açmadığını kontrol etmek için sessionStorage kullanabilir – charlietfl

cevap

1

angularjs bir SPA (here bu konuda biraz okuyabilir) olarak çalışmaktadır. Buradaki nokta şudur: sayfa diğer herhangi bir SPA gibi yeniden yüklendiğinde, tüm verilerini kaybedecek ve uygulama "yeniden yazılmış" olacaktır. Bu yüzden bu problemi alıyorsunuz.

bunu çözmek için kolay bir yolu var: o app.run() (varsa) gider bundan sonra uygulama yüklenir/yeniden, bu app.config() ve rigth gider. Bu nedenle, sizin için çözümüm, kullanıcı bilginizi yerel veriler üzerinde tutmak (bir çerez gibi çalışır) ve ardından uygulama başlatıldığında oradan sizden istemek. Ben tahmin ediyorum

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

Eğer söylenmiştir değişken $rootScope.userInfo

üzerinde kullanıcıların bilgi tutmak, şiddetle Bunun yerine $ rootScope üzerinde daha verilerinizi tutmak için bir hizmeti denemenizi öneririz. Here's bunu nasıl başarabileceğiniz hakkında bir kılavuz.

Umarım bu sizin sorununuzu çözer. Eğer İon ile çalışıyorsanız

** GÜNCELLEME

böyle bir şey deneyebilirsiniz:

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

bu reference onu aldı.

+0

Merhaba Gerardo, Bunu bir vereceğim! Sadece FYI, başlangıçta Kullanıcıları almak için bir hizmet kullanmaya çalışıyordum - Gönderdiğim bu soruya bakın - http://stackoverflow.com/questions/36225588/cant-get-firebase-reference-to-id-to-define- şu anki kullanıcı. Ancak, bir nedenden dolayı hizmetten istediğim öğelerin denetleyicimde bir '$ waitForAuth' dışında bir' $ waitForAuth' işlevinin dışında bir console.logda göründüğünü buldum. –

+0

Globals'ı bir hizmette tutmak iyi bir uygulamadır. Ancak, bir sebepten dolayı sorun çıkarsa, size en uygun olanla gitmek her zaman iyidir.Sadece '$ rootScope' ile sert olmayın, uygulamanızdan okumak için zor olabilir. –

+0

Merhaba @Gerardo, Kodumuzu sizinkilere uydurmak için nasıl uyarlayabileceğimi anlamaya çalışıyordum ve "run" işlevi için kodumu yeniden yerleştirmek istiyorum çünkü $ ionicPlatform.ready() 'gibi bir şeyleri üzmek istemiyorum. Bunun için cevabınızı değiştirir misiniz? –