使用AngularFire查找/加入数据

时间:2016-08-22 10:16:02

标签: firebase firebase-realtime-database angularfire

我有一个关于如何在前端显示数据之前组合来自不同Firebase数据库节点的数据的问题。我有一个具有以下结构的Firebase数据库。 (我是nosql设置的新手,所以这看起来更具关系性):

{
  "agents" : {
    "-KPCmnwzjd8CeSdrU3As" : {
    "contactNumber" : "12345",
    "name" : "aaa"
    },
    "-KPCmw6dKuopDlsMVOlU" : {
     "contactNumber" : "123",
     "name" : "bbb"
    },
    "-KPCoWcLecpchcFV-vh_" : {
     "contactNumber" : "123",
     "name" : "ccc"
    },
    "-KPROMhPatLjVxMdvfLf" : {
     "contactNumber" : "256342",
     "name" : "blah"
    },
    "-KPWIFl5qp5FvAeC3YhG" : {
     "contactNumber" : "123",
     "name" : "eee"
    }
  },
  "listings" : {
    "-KPWKTvW3GzFEIT2hUNU" : {
      "agent" : "-KPCoWcLecpchcFV-vh_",
      "description" : "third",
      "reference" : "REF1"
    }
  }
}

我使用的是Firebase SDK 3.2.0和AngularFire 2.0.1。在我的Angular应用程序中,我可以获取列表列表,并为每个列表查找代理信息。我没有将代理商信息与商家信息一起存储的原因是我希望能够更新代理商,并且更改应反映所有商家信息。如果代理电话号码发生变化,我不想更新所有列表(例如)。

在我的控制器中,我有以下内容:

// get the listings
var listingsRef = firebase.database().ref().child('listings');
vm.listings = $firebaseArray(listingsRef);

// this will move to my ui-router as a resolve but for simplicity's sake
// I added it here...
vm.listings.$loaded().then(function(data){
  // loop through the listings...
  data.forEach(function(listing) {
    if (listing.agent) {
      // get the agent for the listing 
      listing.agent = AgentFactory.getAgent(listing.agent);
    }
  });
});

现在数据正在前端正确显示。由于需要解析getAgent承诺,因此显示代理数据会略有延迟。

我的问题是: 这是获取代理数据的正确方法吗?我应该循环遍历列表和每个查询代理数据吗?如何等待/跟踪要解决的所有getAgent?

任何帮助都将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:0)

我的数据结构相似。如果您想等待所有getAgents解决,可以使用$q.all。我不完全确定您AgentFactory.getAgent的回复,但我们假设它是$firebaseObject。如果是这种情况,请注入$q,然后执行以下操作:

vm.listings.$loaded().then(function (data) {
    // loop through the listings...
    var promises = [];
    data.forEach(function (listing) {
        if (listing.agent) {
            // get the agent for the listing
            listing.agent = AgentFactory.getAgent(listing.agent);
            promises.push(listing.agent.$loaded());
        }
    });
    return $q.all(promises);
}).then(function (agents) {
    //all agents are loaded
});