我正在使用带有Firebase的angularJs。 要从firebase检索数据,请使用以下代码。
Controller.js
$scope.load_msg=function(){
$scope.msg=[];
Chat.load_msg($scope.name,$scope.user.profile.name).then(function(arr){
$scope.msg=arr;
console.log($scope.msg);
},function(error){
console.log(error);
});
}
Service.js
load_msg:function(name,frm){
var deferred = $q.defer();
var sref=ref.child('/Chats/'+frm);
var rref=ref.child('Chats/'+name);
var msgArray=[];
ref.orderByChild("to").equalTo(name).once('child_added',function(messages){
msgArray=msgArray.concat(messages.val());
deferred.resolve(msgArray);
},function(error){
deferred.reject(error);
});
return deferred.promise;
}
msgArray
包含on()查询的所有元素,但回到控制器arr
只查询第一个对象。如何通过promise发送整个数组msgArray
?
答案 0 :(得分:0)
问题在于:
load_msg:function(name,frm){
var msgArray=[]; //You reset the array every time the function is called!!
ref.orderByChild("to").equalTo(name).once('child_added',function(messages){
msgArray=msgArray.concat(messages.val());
deferred.resolve(msgArray);
});
return deferred.promise;
}
将此更改为以下内容:
ServiceFunction() {
var msgArray = [];
return {
load_msg:function(name,frm){
ref.orderByChild("to").equalTo(name).once('child_added',function(messages){
msgArray=msgArray.concat(messages.val());
//deferred resolve etc...
});
}
}
答案 1 :(得分:0)
你正在使用.once('child_added'
,它只会触发一次:第一个子项目。
使用on('child_added'
或once('value'
。由于您调用了参数messages
,因此您可能正在寻找后者:
ref.orderByChild("to").equalTo(name).once('value',function(messages){
messages.forEach(function(message) {
msgArray.push(message.val());
});
deferred.resolve(msgArray);
},function(error){
deferred.reject(error);
});