如何使用 AngularJS 从 Firebase 读取对象
How to read Object from Firebase using AngularJS
我正在开发我的应用程序,其中一项功能是在应用程序内发送消息。我所做的是,我开发了 'send message' window,用户可以在其中向其他用户发送消息。其背后的逻辑如下:
1. 用户A给用户B发送消息。
2. Firebase 在 'Messaging' 中创建以下节点:
"Messaging"->"User A"->"User B"->"Date & Time"->"UserA: Message"
"Messaging"->"User B"->"User A"->"Date & Time"->"UserA: Message"
这是我用来发送消息的代码:
sendMsg: function(receiver, content) {
var user = Auth.getUser();
var sender = user.facebook.id;
var receiverId = receiver;
var receiverRef = $firebase(XXX.firebase.child("Messaging").child(receiverId).child(sender).child(Date()));
var senderRef = $firebase(XXX.firebase.child("Messaging").child(sender).child(receiverId).child(Date()));
receiverRef.$set(sender,content);
senderRef.$set(sender,content);
},
(imgur相册中的图片1)
目前,我正在尝试从数据库中读取消息,并根据日期对它们进行排序。到目前为止,我已经完成的是,我以对象的形式存储了 "Messaging/UserA/" 的内容。在我附上的图片中可以看到该对象(图片 2)。
数据接收代码:
getMsgs: function () {
var user = Auth.getUser();
var userId = user.facebook.id;
var messagesPath = new Firebase("https://xxx.firebaseio.com/Messaging/");
var Messages = messagesPath.child(userId);
Messages.on("value", function (snapshot) {
var messagesObj = snapshot.val();
return messagesObj;
}, function (errorObject) {
console.log("Error code: " + errorObject.code);
});
}
我的问题是:如何读取对象的消息?我想根据日期排序,获取消息并获取发送消息的用户的 Id。
非常感谢!
您在阅读消息时似乎陷入了异步加载陷阱:
getMsgs: function () {
var user = Auth.getUser();
var userId = user.facebook.id;
var messagesPath = new Firebase("https://xxx.firebaseio.com/Messaging/");
var Messages = messagesPath.child(userId);
Messages.on("value", function (snapshot) {
var messagesObj = snapshot.val();
return messagesObj;
}, function (errorObject) {
console.log("Error code: " + errorObject.code);
});
}
您在 Messages.on("value"
回调中的 return
声明对任何人都没有 return 那个价值。
如果我们将回调拆分成一个单独的函数,通常会更容易看到发生了什么:
onMessagesChanged(snapshot) {
// when we get here, either the messages have initially loaded
// OR there has been a change in the messages
console.log('Inside on-value listener');
var messagesObj = snapshot.val();
return messagesObj;
},
getMsgs: function () {
var user = Auth.getUser();
var userId = user.facebook.id;
var messagesPath = new Firebase("https://xxx.firebaseio.com/Messaging/");
var Messages = messagesPath.child(userId);
console.log('Before adding on-value listener');
Messages.on("value", onMessagesChanged);
console.log('After adding on-value listener');
}
如果您 运行 像这样的代码段,您将看到控制台记录:
Before adding on-value listener
After adding on-value listener
Inside on-value listener
这可能不是您所期望的,这是因为 Firebase 必须从其服务器检索消息,这可能需要很长时间。浏览器不会让用户等待,而是继续执行代码并在数据可用时调用所谓的回调函数。
在 Firebase 的情况下,只要用户更改或添加消息,您的函数实际上可能会被调用多次。所以输出更有可能是:
Before adding on-value listener
After adding on-value listener
Inside on-value listener
Inside on-value listener
Inside on-value listener
...
因为回调函数是异步触发的,你不能return从它给原始函数一个值。解决此问题的最简单方法是在回调中执行屏幕更新。所以说你想记录消息,你会这样做:
onMessagesChanged(snapshot) {
// when we get here, either the messages have initially loaded
// OR there has been a change in the messages
console.log('Inside on-value listener');
var i = 0;
snapshot.forEach(function(messageSnapshot) {
console.log((i++)+': '+messageSnapshot.val());
});
},
请注意,无论您使用什么 API 访问 Firebase,这个问题都是一样的。但是不同的库以不同的方式处理它。例如:AngularFire 通过在数据返回时通知您 AngularJS 数据更改,使您免受这些复杂性的影响。
另见:Asynchronous access to an array in Firebase
我正在开发我的应用程序,其中一项功能是在应用程序内发送消息。我所做的是,我开发了 'send message' window,用户可以在其中向其他用户发送消息。其背后的逻辑如下:
1. 用户A给用户B发送消息。
2. Firebase 在 'Messaging' 中创建以下节点:
"Messaging"->"User A"->"User B"->"Date & Time"->"UserA: Message"
"Messaging"->"User B"->"User A"->"Date & Time"->"UserA: Message"
这是我用来发送消息的代码:
sendMsg: function(receiver, content) {
var user = Auth.getUser();
var sender = user.facebook.id;
var receiverId = receiver;
var receiverRef = $firebase(XXX.firebase.child("Messaging").child(receiverId).child(sender).child(Date()));
var senderRef = $firebase(XXX.firebase.child("Messaging").child(sender).child(receiverId).child(Date()));
receiverRef.$set(sender,content);
senderRef.$set(sender,content);
},
(imgur相册中的图片1)
目前,我正在尝试从数据库中读取消息,并根据日期对它们进行排序。到目前为止,我已经完成的是,我以对象的形式存储了 "Messaging/UserA/" 的内容。在我附上的图片中可以看到该对象(图片 2)。
数据接收代码:
getMsgs: function () {
var user = Auth.getUser();
var userId = user.facebook.id;
var messagesPath = new Firebase("https://xxx.firebaseio.com/Messaging/");
var Messages = messagesPath.child(userId);
Messages.on("value", function (snapshot) {
var messagesObj = snapshot.val();
return messagesObj;
}, function (errorObject) {
console.log("Error code: " + errorObject.code);
});
}
我的问题是:如何读取对象的消息?我想根据日期排序,获取消息并获取发送消息的用户的 Id。
非常感谢!
您在阅读消息时似乎陷入了异步加载陷阱:
getMsgs: function () {
var user = Auth.getUser();
var userId = user.facebook.id;
var messagesPath = new Firebase("https://xxx.firebaseio.com/Messaging/");
var Messages = messagesPath.child(userId);
Messages.on("value", function (snapshot) {
var messagesObj = snapshot.val();
return messagesObj;
}, function (errorObject) {
console.log("Error code: " + errorObject.code);
});
}
您在 Messages.on("value"
回调中的 return
声明对任何人都没有 return 那个价值。
如果我们将回调拆分成一个单独的函数,通常会更容易看到发生了什么:
onMessagesChanged(snapshot) {
// when we get here, either the messages have initially loaded
// OR there has been a change in the messages
console.log('Inside on-value listener');
var messagesObj = snapshot.val();
return messagesObj;
},
getMsgs: function () {
var user = Auth.getUser();
var userId = user.facebook.id;
var messagesPath = new Firebase("https://xxx.firebaseio.com/Messaging/");
var Messages = messagesPath.child(userId);
console.log('Before adding on-value listener');
Messages.on("value", onMessagesChanged);
console.log('After adding on-value listener');
}
如果您 运行 像这样的代码段,您将看到控制台记录:
Before adding on-value listener
After adding on-value listener
Inside on-value listener
这可能不是您所期望的,这是因为 Firebase 必须从其服务器检索消息,这可能需要很长时间。浏览器不会让用户等待,而是继续执行代码并在数据可用时调用所谓的回调函数。
在 Firebase 的情况下,只要用户更改或添加消息,您的函数实际上可能会被调用多次。所以输出更有可能是:
Before adding on-value listener
After adding on-value listener
Inside on-value listener
Inside on-value listener
Inside on-value listener
...
因为回调函数是异步触发的,你不能return从它给原始函数一个值。解决此问题的最简单方法是在回调中执行屏幕更新。所以说你想记录消息,你会这样做:
onMessagesChanged(snapshot) {
// when we get here, either the messages have initially loaded
// OR there has been a change in the messages
console.log('Inside on-value listener');
var i = 0;
snapshot.forEach(function(messageSnapshot) {
console.log((i++)+': '+messageSnapshot.val());
});
},
请注意,无论您使用什么 API 访问 Firebase,这个问题都是一样的。但是不同的库以不同的方式处理它。例如:AngularFire 通过在数据返回时通知您 AngularJS 数据更改,使您免受这些复杂性的影响。
另见:Asynchronous access to an array in Firebase