我试图从firebase及其格式中检索数据:
>Users
--->UID
------>email:
------>height:
------>etc...
由于某种原因,当我尝试获取say email的值时,UID会继续返回undefined。这是尝试检索数据的代码:
.factory('Chats', function($rootScope) {
// Might use a resource here that returns a JSON array
var chats;
return {
all: function() {
return chats;
},
initialize: function(isLoggedIn) {
var data = $rootScope.ref.getAuth().uid;
console.log("initialize: " + data);
if(isLoggedIn == true) {
$rootScope.ref.on("value", function(snapshot) {
console.log("Value: " + snapshot.val());
console.log("Users: " + snapshot.val().users);
console.log("Data: " + snapshot.val().users.data.email);
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
}
}
};
})
当它获得第三个console.log('数据'一个)时会中断,它会抛出异常说:
Cannot read property 'email' of undefined
但是当我在if语句之前记录变量data1时,它以字符串的形式返回用户的正确UID,所以我不明白为什么它告诉我它未定义。我试图做的就是挖掘我的firebase树并根据用户的UID检索用户的值(电子邮件,高度等) - 我通过调用ref.getAuth()。uid来检索。
先谢谢!
答案 0 :(得分:0)
您正在阅读Firebase的根目录,然后尝试访问:
snapshot.val().users.data.email
对应于:
/users/data/email
如果您检查JSON数据,则会发现/users
没有名为data
的子节点。要使用数据的值,您需要使用括号表示法:
snapshot.val().users[data].email
请注意,您加载的方式比您的方法更多。如果您只从数据库下载数据,您的用户可能会很感激,您可以这样做:
$rootScope.ref.child("users").child(data).on("value", function(snapshot) {
console.log("Data: " + snapshot.val().email);
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
最后一点:如果您将电子邮件地址绑定到$scope
,您会发现Angular视图不会立即获取它。这是因为on()
回调中的代码是异步调用的,到那时AngularJS不再知道您的操作了。您可以了解如何让AngularJS了解此答案中的更改:Firebase callbacks and AngularJS。但另外,L考虑使用AngularFire来完全避免这个问题。