如何绕过唯一ID获取Firebase中snapshot.val()的子属性

时间:2016-01-28 23:58:11

标签: javascript angularjs firebase angularfire

我正在尝试查询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 的属性?

1 个答案:

答案 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'>