我正在尝试查询Firebase数据库中的产品列表,当我查询该列表时,我想要检索该产品的网址。
我已经能够查询产品列表了。当我使用以下内容时:
$scope.filterForResult = function(userResponse){
this.query = cleatsRef
.orderByChild('filter')
.startAt(userResponse.color+"_"+userResponse.sex+"_"+userResponse.studs+"_"+userResponse.upper+"_"+userResponse.price)
.endAt(userResponse.color+"_"+userResponse.sex+"_"+userResponse.studs+"_"+userResponse.upper+"_"+userResponse.price);
this.result = this.query.on('value', function(snapshot){
return resultProduct = console.log(snapshot.val());
});
};
当我回复以下 userResponses 时: color =“black”,sex =“male”,studs =“firm ground”,upper =“synthetic”,price =“50”,我收到正确的产品,作为对象:
"cleats":{
"adidas ACE 15,4 FG - Core Black - Matte Silver - White":{
"brand":"adidas",
"color":"black",
"filter":"black_male_firm ground_synthetic_50",
"price":50,
"sex":"male",
"stud":"firm ground",
"upper":"synthetic",
"url":"http://www.prodirectsoccer.com/US/products/adidas-ACE-154-FG-Mens-Soccer-Shoes-Firm-Ground-Core-Black-Matte-Silver-White-118537.aspx?"},"adidas ACE 15,4 FxG - Core Black - Silver Metallic - Solar Yellow":{"brand":"adidas","color":"black","price":50,"sex":"male","stud":"firm ground","upper":"synthetic","url":"http://www.prodirectsoccer.com/US/products/adidas-ACE-154-FxG-Soccer-Cleats-All-Ground-Core-Black-Silver-Metallic-Solar-Yellow-108740.aspx?"
}
}
但是,我想要做的下一步是检索产品的网址。我如何绕过唯一ID adidas ACE 15,4 FG - Core Black - Matte Silver - White 才能访问Firebase中 url 的属性?
答案 0 :(得分:0)
这里有两件事情。
每当您执行Firebase查询时,该值始终是子项列表。即使只有一个结果,它仍然会在一个列表中。
所以你需要在你的代码中处理它。
var filter = userResponse.color+"_"+userResponse.sex+"_"+userResponse.studs+"_"+userResponse.upper+"_"+userResponse.price;
this.query = cleatsRef
.orderByChild('filter')
.startAt(filter)
.endAt(filter);
this.result = this.query.on('value', function(snapshot){
snapshot.forEach(function(child) {
console.log(child.val());
});
});
第二个问题是您正在尝试返回仍在加载的数据。这是不可能的,你不能等到它被加载(你的用户不会意识到这一点)。
要更好地理解代码流,请添加以下日志语句:
console.log('before query');
this.result = this.query.on('value', function(snapshot){
console.log('in query callback');
snapshot.forEach(function(child) {
console.log(child.val());
});
});
console.log('after query');
你会看到输出是:
查询前查询后
查询回调中的
这可能不是你所期望的。这种排序的原因是on()
仅*开始**加载数据。这可能需要一些时间,因此浏览器继续执行query.on(...
语句之后的代码*。然后,一旦结果可用,它就会调用你的回调函数。
解决方案可以是很多东西。但由于您使用的是AngularFire,因此最有可能:
$scope.result = $firebaseArray(query)
然后在你的HTML中:
<div ng-repeat='child in result'>