以下是official firebase documentation
中的示例代码var app = angular.module("myChatRoom", []);
app.factory("ChatService", function() {
var ref = new Firebase("https://<your-firebase>.firebaseio.com/chat");
return {
getMessages: function() {
var messages = [];
ref.on("child_added", function(snapshot) {
messages.push(snapshot.val());
});
return messages;
},
addMessage: function(message) {
ref.push(message);
}
}
});
app.controller("ChatCtrl", ["$scope", "ChatService",
function($scope, service) {
$scope.user = "Guest " + Math.round(Math.random()*101);
$scope.messages = service.getMessages();
$scope.addMessage = function() {
service.addMessage({from: $scope.user, content: $scope.message});
$scope.message = "";
};
}
]);
我想了解这里发生了什么,因为我无法确定为什么这实际上有效。
当控制器触发时, getMessages()
仅被调用一次。然而,即使之后从未调用getMessages()
,事件绑定也会触发。同样,$ scope属性也会更新。
为什么?另外,这是使用Firebase和Angular服务/工厂的推荐方法吗?
答案 0 :(得分:2)
在getMessages
中,您有以下电话:
ref.on("child_added", function(snapshot) {
...
这会注册一个回调,只要将孩子添加到您的Firebase聊天中,就会调用该回调。
即使getMessages
退出,该回调仍将保持注册状态。这就是为什么你只需要拨打getMessages
一次。该名称有点违反直觉,我可能会称之为registerMessageHandler
或registerForNewMessages
。
无论哪种方式:将为每个添加的子项触发回调,直到您将其关闭(通过调用ref.off("child_added"
)或直到页面重新加载为止。这称为异步操作:无论原始流在何处,都会发生回调。回调流程和主要代码是异步。在这种意义上,它类似于常规JavaScript setInterval
(在主代码继续时也会异步触发)或常见的XMLHttpRequest(通常在其调用方法返回后触发)。