Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 了解firebase在角度服务中的使用_Javascript_Angularjs_Firebase - Fatal编程技术网

Javascript 了解firebase在角度服务中的使用

Javascript 了解firebase在角度服务中的使用,javascript,angularjs,firebase,Javascript,Angularjs,Firebase,下面是来自 var-app=angular.module(“myChatRoom”,[]); 应用程序工厂(“聊天室服务”,函数(){ var ref=新的火基(“https://.firebaseio.com/chat"); 返回{ getMessages:function(){ var消息=[]; 参考(“添加的子对象”,功能(快照){ messages.push(snapshot.val()); }); 返回消息; }, addMessage:函数(消息){ 参考推送(消息); } } }

下面是来自

var-app=angular.module(“myChatRoom”,[]);
应用程序工厂(“聊天室服务”,函数(){
var ref=新的火基(“https://.firebaseio.com/chat");
返回{
getMessages:function(){
var消息=[];
参考(“添加的子对象”,功能(快照){
messages.push(snapshot.val());
});
返回消息;
},
addMessage:函数(消息){
参考推送(消息);
}
}
});
app.controller(“ChatCtrl”、[“$scope”、“ChatService”,
功能(范围、服务){
$scope.user=“Guest”+Math.round(Math.random()*101);
$scope.messages=service.getMessages();
$scope.addMessage=函数(){
service.addMessage({from:$scope.user,content:$scope.message});
$scope.message=“”;
};
}
]);
我想了解这里发生了什么,因为我不能确定这到底是为什么

当控制器触发时,
getMessages()
仅被调用一次。然而,即使以后从未调用过
getMessages()
,事件绑定也会触发。此外,$scope属性也会更新


为什么呢?另外,这是将firebase与角度服务/工厂一起使用的推荐方法吗?

getMessages
中,您有以下调用:

ref.on("child_added", function(snapshot) {
  ...
这将注册一个回调,每当将一个子项添加到Firebase聊天时,就会调用该回调

即使
getMessages
退出,该回调仍将保持注册状态。这就是为什么只需调用
getMessages
一次。这个名字有点违反直觉,我可能会把它叫做
registerMessageHandler
registerForNewMessages


无论哪种方式:都会为每个添加的子项触发回调,直到您将其关闭(通过调用
ref.off(“child\u added”
)或者直到页面重新加载。这被称为异步操作:回调将发生,无论原始流在哪里。回调流和主代码是异步的。从这个意义上讲,它类似于常规JavaScript
setInterval
(在主代码继续运行时,它也会异步启动)或普通XMLHttpRequest(通常在其调用方法返回后启动)。

从新的0.8版本开始,文档已更新为一些更好的服务示例。还有一些帮助
ref.on("child_added", function(snapshot) {
  ...