基于其他数据库的AngularJS Firebase数据库查询过滤器
我获取存储在Firebase数据库中名为用户的当前用户数据下的“项目”字段中的值: 第一种方法:基于其他数据库的AngularJS Firebase数据库查询过滤器,angularjs,firebase,angularjs-ng-repeat,firebase-realtime-database,Angularjs,Firebase,Angularjs Ng Repeat,Firebase Realtime Database,我获取存储在Firebase数据库中名为用户的当前用户数据下的“项目”字段中的值: 第一种方法: var promise = MyUser.user(); promise.then( function onSuccess(user) { $scope.userprojectskeys = user.projects; }); var keyquery = DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
var promise = MyUser.user();
promise.then( function onSuccess(user) {
$scope.userprojectskeys = user.projects;
});
var keyquery = DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
.then(function onSuccess(snapshot) {
snapshot.child("savedprojects").forEach(function(childSnapshot) {
var userprojects = childSnapshot.val();
console.log("my list is :", userprojects );
});
});
第二种方法:
var promise = MyUser.user();
promise.then( function onSuccess(user) {
$scope.userprojectskeys = user.projects;
});
var keyquery = DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
.then(function onSuccess(snapshot) {
snapshot.child("savedprojects").forEach(function(childSnapshot) {
var userprojects = childSnapshot.val();
console.log("my list is :", userprojects );
});
});
第一个方法的$scope.userprojectskeys
和第二个方法的userprojects
都返回所需的数据:第一个方法输出:
第二种方法输出:
my list is : -KUTLAZENGlxtzCtEfaZ
my list is : -KUTLM8r_kmVSTaxzLW5
my list is : -KUTPrs6ARZXjbjtNr7O
另一方面,我有另一个函数,它获取另一个名为projects的数据库下的子项列表,如下所示:
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo("-KUTPrs6ARZXjbjtNr7O");
$scope.projectslist = $firebaseArray(projectquery);
我现在做的是重复
$scope.projectslist
中对象的字段,显示每个项目的字段。<tr ng-repeat="obj in projectslist">
<td>{{ obj.field1}}</td>
<td>{{ obj.field2 }}</td>
<td>{{ obj.field3 }}</td>
<td>{{ obj.field4 }}</td>
</tr>
但这是没有成功的!该表显示了行,但其中没有值:以下是调试器的屏幕截图:
更新: 以下是firebase中mydatabase中我的
用户的子级结构:
其中您可以看到五个用户,对于每个用户,有许多字段,其中一个字段存储用户项目键,在本例中,用户有四个项目键
这是firebasemydatabase中的项目子项:
这里我们可以看到我的firebase数据库的全局视图。
因此,目标是从用户中查找项目键,然后从项目数据库中显示相应的项目,即重复这些项目的字段
更新:
以下是祖拉建议后的控制台日志:
$scope.projectslist = [];
DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
.then(function onSuccess(snapshot) {
snapshot.child("projects").forEach(function (childSnapshot) {
var userprojects = childSnapshot.val();
//console.log("loaded. Data: ", userprojects);
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(userprojects);
var list = ($firebaseArray(projectquery));
console.log("list: ", list);
});
});
每个列表包含当前用户的每个项目所需的信息。完美的
但是如何访问它们并将它们存储在$scope
中,以便能够在我的html中调用它呢?
更新:
我只能通过将列表传递到$scope中来显示最后一个项目:
显示的项目是每个迭代的最后一个问题是如何显示forEach的所有迭代并将其传递到数组中?
2016年10月25日更新:
下面是连接对象的代码的更新版本:首先是一个,然后是前两个,前三个,最后是连接到一个大数组中的所有对象,请参见下面的控制台日志:
$scope.projectslist = [];
DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
.then(function onSuccess(snapshot) {
snapshot.child("projects").forEach(function (childSnapshot) {
var userprojects = childSnapshot.val();
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(userprojects);
var list = $firebaseArray(projectquery);
$scope.list = $firebaseArray(projectquery);
console.log("list: ", $scope.list);
list.$loaded(function(){
$scope.projectslist = $scope.projectslist.concat(list);
console.log("loaded: ", $scope.projectslist);
});
});
});
每个对象都直接包含我需要的信息,如前一个对象屏幕截图所示。推荐
- 如果可能,请始终使用vs原始firebase
承诺。三向绑定+
$scope.$apply
自动地所以你不必去想它
- 如果正在获取,请使用
$firebaseObject
而不是$firebaseArray
只有一个对象
var user = $firebaseObject(DatabaseRef.ref('/users/' + userId));
user.$loaded(function(){
console.log("User loaded. Data: ", user);
angular.forEach(user.projects, function(value, key){
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(key);
// var list = $firebaseArray(projectquery);
// list.$loaded(function(){
// $scope.projectslist = $scope.projectslist.concat(list);
// });
// or shortly. Replace 4 lines above with this line.
$scope.projectslist.push($firebaseObject(projectquery));
});
});
------------------------------------------------------------------------------------------------------------------------------------
您的问题在以下代码中
$scope.projectslist.push($firebaseArray(projectquery));
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(userprojects);
var list = $firebaseArray(projectquery);
list.$loaded(function(){
$scope.projectslist.contact(list);
});
firebaseArray()
返回数组,push
方法所做的是将给定参数推送到数组的末尾。这里有一个数组,它也包含数组
相反,您希望使用$firebaseArray(projectquery)
连接现有阵列
我建议尝试以下代码
$scope.projectslist.push($firebaseArray(projectquery));
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(userprojects);
var list = $firebaseArray(projectquery);
list.$loaded(function(){
$scope.projectslist.contact(list);
});
如果您正在使用,我认为您也应该使用$firebaseObject
修改获取用户项目。而且您不需要使用orderByKey
,因为您只获取一个对象
var user = $firebaseObject(DatabaseRef.ref('/users/' + userId));
user.$loaded(function(){
console.log("User loaded. Data: ", user);
angular.forEach(user.projects, function(value, key){
var projectquery = DatabaseRef.ref("projects").orderByKey().equalTo(key);
// var list = $firebaseArray(projectquery);
// list.$loaded(function(){
// $scope.projectslist = $scope.projectslist.concat(list);
// });
// or shortly. Replace 4 lines above with this line.
$scope.projectslist.push($firebaseObject(projectquery));
});
});
更新
由于您只获得一个列表,所以最好尝试$firebaseObject
并获取对象并将其推送到数组中
2016年10月25日更新:
现在你的问题来了
DatabaseRef.ref('/users/' + userId).orderByKey().once("value")
.then(function onSuccess(snapshot) {
snapshot.child("projects").forEach(function (childSnapshot) {
这不是按照我的建议做的。您没有使用angularfire,html不会自动重新编译。您应该在成功
promise或更高版本的onSuccess的末尾调用$scope.$apply
。。。您应该使用angularfire方法-$firebaseObject
,它会自动调用$scope.$apply
var user = $firebaseObject(DatabaseRef.ref('/users/' + userId));
user.$loaded(function(){
console.log("User loaded. Data: ", user);
angular.forEach(user.projects, function(value, key){
我的第一个问题是,在列表的最后一行中,联系人是什么?它是从哪里来的?它有什么作用?我在问题的原始代码中没有。第二,我试图实现你的答案,但没有成功。当我实现您的第二个代码时,我会收到关于用户重复声明的警告。你能重温一下你的答案并告诉我你有什么建议吗?我添加了我的数据库结构的截图。你是说通过联系来连接吗?无论如何,我也尝试过这个,但没有成功。我替换了$scope.projectslist.push($firebaseArray(projectquery))代码>根据您的建议:var list=$firebaseArray(projectquery)代码>列表包含我需要的内容!但它们存储在每个数组的[0]处。如何连接它们?这是我添加到问题中的列表的控制台日志。是的,它应该是concat而不是contact。对不起,这个打字错误。在连接之后,它返回新数组,而不是修改现有数组。检查我的最新答案。