0

İyonik/Firebase için çok yeniyim ama kodumu temizlemeye çalışıyorum, böylece veritabanı erişimi ile ilgili her şey fabrikamda.Geçerli kullanıcı nesnesini her zaman İyonik/Firebase'den temin etmek için fabrika yaratın

Kullanıcılarımı yapılandırmamın yolu, Facebook veya Google da dahil olmak üzere herhangi bir yeni Kimlik Doğrulamasının kullanıcı kimliğiyle birlikte ilişkili anahtarla birlikte saklanmasıdır. Kullanıcı ayrıca kullanıcı dizisinde saklanır (yukarıdaki tuşun rastgele oluşturulduğu yer). Bu, geçerli kullanıcıya Auth nesnesinden erişmeme izin verir.

{ 
    "uids" : { 
    "7d34fb85-813c-4586-857e-f062aed67f32" : { 
     "-KDQDk5vwJXmFngwI7iQ" : { 
     "registered" : true 
     } 
    } 
    }, 
    "users" : { 
    "-KDQDk5vwJXmFngwI7iQ" : { 
     "email" : "[email protected]", 
     "firstname" : "TestName", 
     "lastname" : "TestLastName", 
     "uid" : "7d34fb85-813c-4586-857e-f062aed67f32" 
    } 
    } 
} 

Şimdi ben geçerli kullanıcı ayrıntılarını almak için herhangi bir kontrol cihazından çağırabilir bir fabrika yaratmak çalışıyorum - Ancak vb ad, soyadı

, bu olduğunu sanmıyorum İşe koyulmanın doğru yolu. İdeal olarak, herhangi bir kontrolörde Users.getCurrentUser.firstname'u arayabilmek istiyorum.

İşte iki fabrika. Neyi yanlış yapıyorum ve kodumu nasıl yeniden yapılandırabilirim?

/** 
* Authentication service 
*/ 
    app.factory('Auth', ['rootRef', '$firebaseAuth', function (rootRef, $firebaseAuth) { 
     return $firebaseAuth(rootRef); 
    }]); 

/** 
* Anything related to the Users array 
*/ 
app.factory('Users', ['$firebaseArray','$firebaseObject', 'Auth', function ($firebaseArray, $firebaseObject, Auth) { 

    var ref = new Firebase("https://[myfirebaseurl].firebaseio.com"); 
    var users = $firebaseArray(ref.child('users')); 
    var uids = $firebaseArray(ref.child('uids')); 

    return { 
     all: function() { 
      return users; 
     }, 
     get: function (id) { 
      // Simple index lookup - I also want to be able to use this if a user lets say clicks a user profile in a list of profiles in the app to view a profile, but currently I have no user_id key in my database - do I need to set this up? 
      return users[id]; 
     }, 
     getCurrentUser: function() { 
      var uid = Auth.$getAuth().uid; 
      var key = new Firebase(uids + uid).child(); 
      var user = new Firebase(users + key).child(); 
      return $firebaseObject(user); 
     } 
    } 

}]) 

En çok takdir edilen herhangi bir yardım.

Teşekkürler.

+0

Sen bir resim yer verdik Sorunuzdaki JSON ağacı. Lütfen Firebase veritabanınızdaki Dışa Aktar düğmesini tıklayarak kolayca alabileceğiniz metin olarak gerçek JSON ile değiştirin. JSON'un metne dönüştürülmesini sağlamak, onu gerçek verilerinizle test etmek ve cevabımızda kullanmak için genel olarak kullanmamıza izin verir ve genel olarak yapılması gereken sadece iyi bir şeydir. –

+0

@FrankvanPuffelen, değişikliklere bakın. –

cevap

1

Bu asla işe yaramayacak:

modern web çoğu gibi
Users.getCurrentUser().firstname 

Firebase yükleme verileri uyumsuz olur. Veriler yüklenirken (ve Firebase'nin durumunda, daha sonra senkronize edilecek), JavaScript kodu çalışmaya devam eder.

Bu nedenle "kullanıcı verileri yüklendiğinde/değiştirildiğinde" işleminden "yüklemeyi başlat" seçeneğini bölmeniz gerekir. AngularFire yılında

, sen çözmek için $loaded() vaadi bekleyerek kullanıcı için yüklenen ilk verileri elde edebilirsiniz:

var user = $firebaseObject(user); 
user.$loaded(function(user) { 
    console.log(user.firstname); 
}); 

Ama bu kullanıcı verileri beri, gerçekten bir anti-kalıptır may daha sonra değişecek ve bu sizin $loaded() tekrar geri aramayacaktır.

basitçe angularjs nesneleri görselleştirmek için AngularFire ile olan neler olduğunu görmek için en iyi yoldur bakın: o zaman

$scope.user = $firebaseObject(user); 

Ve:

<pre> user | json </pre> 
+0

Tamam anlaşıldı: çöz. Ancak kodun tüm bu bölümlerinin nereye gittiğini açıklayabilir misiniz? Kullanıcı değişkeni, gerçekte $ firebaseObject' için argüman olan nerededir? Ve bu "$ yüklü" kod, geçerli kullanıcıyı elde etmek için her kontrolöre gider? Bu mevcut kullanıcıyı elde etmek için bir şeyi yeniden kullanmanın bir yolu yok örn. bir servis/fabrika? Buna ek olarak, kullanıcı kodun kullanıcı kimliğinden ve anahtarından doğru olması için kodumun doğru olup olmadığını netleştirebilir misiniz? –