2016-05-05 6 views
0

私は、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()は上から照会すべての要素を含むが、バックコントローラarrでのみ照会最初のオブジェクトを有しています。約束をどのようにmsgArray全体の配列を送信するには?

+0

約束は1回限り解決できます。配列が完了する前に 'resolve'メソッドを呼び出さないでください。 – Bergi

+0

私は解決策をどこに呼び出すべきか教えてください。私は解決策を見つけることができない – Yash

答えて

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; 
} 

変更:あなたは一度だけ発生します.once('child_added'を、使用している

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... 
    }); 
    } 
} 
0

:最初の子アイテムのため。

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); 
}); 
関連する問題