使用 firebase、angularFire 获取非规范化数据
Fetching denormalized data with firebase, angularFire
我正在尝试获取属于某个用户的所有花卉数据,在本例中为 simplelogin:69。
我从用户那里获取所有花键开始,像这样:
/users/simplelogin:69/flowers/
var ref = new Firebase("https://URL.firebaseio.com/users/"+uid+"/flowers");
var sync = $firebase(ref);
现在我一直在寻找一种干净的方法来获取所有花数据,方法是循环遍历 simplelogin:69 中的每个花键,而不是循环遍历 /flowers/ 中的每个键(在下面的示例中,我只有三个花键但在生产中我可能有 10k)。
我尝试了 FirebaseIndex 和 firebase-util,但无法正常工作。有没有人有任何提示或任何东西?我已经在堆栈上阅读过以前的帖子,但大多数似乎已经过时或不太适合我的目标。真的很感激任何可以用 AngularFire 解决的问题。
亲切的问候,
埃利亚斯
{
"flowers" : {
"-JiU57sFAfQwYtIq-LCl" : {
"image" : "test",
"name" : "test",
"type" : "Roses",
"uid" : "simplelogin:69"
},
"-JiU9-3ajlnFLpyUmBvL" : {
"image" : "dasdasd",
"name" : "sadasdas",
"type" : "Roses",
"uid" : "simplelogin:69"
},
"-JiUF-mioK3jQCYy6ZiG" : {
"image" : "ss",
"name" : "ss",
"type" : "Lilies",
"uid" : "simplelogin:69"
}
},
"users" : {
"simplelogin:69" : {
"flowers" : {
"-JiU57sFAfQwYtIq-LCl" : true,
"-JiU9-3ajlnFLpyUmBvL" : true,
"-JiUF-mioK3jQCYy6ZiG" : true
}
},
"simplelogin:70" : {
},
"simplelogin:71" : {
}
}
}
这对于 Firebase 来说确实是一个棘手的问题。如果您为用户的鲜花列表实现 custom factory object,您可以在列表更改时动态请求新的鲜花数据。
现在可以使用了,感谢@Kato 在线程上的回答:
Firebase data normalized. How should I fetch a collection based on this structure?(在创建此线程之前尝试过,但没有成功,所以做了一些小改动,现在可以了)。
为遇到相同情况的任何人发布解决方案:
$scope.flowers = {};
var flowerRef = new Firebase('https://URL.firebaseio.com/flowers/');
var keyRef = new Firebase('https://URL.firebaseio.com/users/'+checkAuth.auth.uid+'/flowers');
keyRef.on('child_added', function(snap) {
var flowerId = snap.key();
flowerRef.child(flowerId).on('value', function(snap) {
$timeout(function() {
if( snap.val() === null ) {
delete $scope.flowers[flowerId];
}
else {
$scope.flowers[flowerId] = snap.val();
}
});
});
});
keyRef.on('child_removed', function(snap) {
var flowerId = snap.key();
$timeout(function(snap) {
delete $scope.flowers[flowerId];
});
});
我正在尝试获取属于某个用户的所有花卉数据,在本例中为 simplelogin:69。
我从用户那里获取所有花键开始,像这样:
/users/simplelogin:69/flowers/
var ref = new Firebase("https://URL.firebaseio.com/users/"+uid+"/flowers");
var sync = $firebase(ref);
现在我一直在寻找一种干净的方法来获取所有花数据,方法是循环遍历 simplelogin:69 中的每个花键,而不是循环遍历 /flowers/ 中的每个键(在下面的示例中,我只有三个花键但在生产中我可能有 10k)。
我尝试了 FirebaseIndex 和 firebase-util,但无法正常工作。有没有人有任何提示或任何东西?我已经在堆栈上阅读过以前的帖子,但大多数似乎已经过时或不太适合我的目标。真的很感激任何可以用 AngularFire 解决的问题。
亲切的问候, 埃利亚斯
{
"flowers" : {
"-JiU57sFAfQwYtIq-LCl" : {
"image" : "test",
"name" : "test",
"type" : "Roses",
"uid" : "simplelogin:69"
},
"-JiU9-3ajlnFLpyUmBvL" : {
"image" : "dasdasd",
"name" : "sadasdas",
"type" : "Roses",
"uid" : "simplelogin:69"
},
"-JiUF-mioK3jQCYy6ZiG" : {
"image" : "ss",
"name" : "ss",
"type" : "Lilies",
"uid" : "simplelogin:69"
}
},
"users" : {
"simplelogin:69" : {
"flowers" : {
"-JiU57sFAfQwYtIq-LCl" : true,
"-JiU9-3ajlnFLpyUmBvL" : true,
"-JiUF-mioK3jQCYy6ZiG" : true
}
},
"simplelogin:70" : {
},
"simplelogin:71" : {
}
}
}
这对于 Firebase 来说确实是一个棘手的问题。如果您为用户的鲜花列表实现 custom factory object,您可以在列表更改时动态请求新的鲜花数据。
现在可以使用了,感谢@Kato 在线程上的回答: Firebase data normalized. How should I fetch a collection based on this structure?(在创建此线程之前尝试过,但没有成功,所以做了一些小改动,现在可以了)。
为遇到相同情况的任何人发布解决方案:
$scope.flowers = {};
var flowerRef = new Firebase('https://URL.firebaseio.com/flowers/');
var keyRef = new Firebase('https://URL.firebaseio.com/users/'+checkAuth.auth.uid+'/flowers');
keyRef.on('child_added', function(snap) {
var flowerId = snap.key();
flowerRef.child(flowerId).on('value', function(snap) {
$timeout(function() {
if( snap.val() === null ) {
delete $scope.flowers[flowerId];
}
else {
$scope.flowers[flowerId] = snap.val();
}
});
});
});
keyRef.on('child_removed', function(snap) {
var flowerId = snap.key();
$timeout(function(snap) {
delete $scope.flowers[flowerId];
});
});