将 Geofire 与现有的 firebase 数据库集成

Integrating Geofire with existing firebase database

我已经浏览了 Geofire 的 github Fish 示例,但仍不清楚如何在我的应用程序中实施它。 我的用例:我的应用程序向登录用户显示 events/meetups。目前在我的应用程序中,我在 firebase ref(events) 处有 firebase 侦听器。

database.ref('events').orderByChild('startTime').on('value', (snapshot) => { 
 const feed = snapshot.val() || {}
})

目前,在初始加载时,客户端应用程序在事件引用处获取整个对象,然后每个事件数据都以 table(每行一个事件)的形式显示给用户。

我知道使用 geofire 我可以使用 set() 函数来保存每个事件键及其地理位置 [lat, lng]。然后使用查询我可以检索落在指定半径内的事件键列表到用户当前位置(html5 地理位置)。但是我该如何处理这些键,因为没有数据附加到它们,我是否为 Events ref 中的每个事件键设置单独的 "on" 侦听器?然后显示事件数据?

当您使用 Geofire 时,您最终会在 JSON 树中得到两个分支:一个包含对象的地理数据,另一个包含实际数据。

objects
  objectId1: { ... }
  objectId2: { ... }
  objectId3: { ... }      
geodata
  objectId1: { ... }
  objectId2: { ... }
  objectId3: { ... }

当您针对 geodata 节点触发 GeoQuery 时,您会取回属于该查询范围内的对象的键。例如 objectId2objectId3.

然后您使用该键在 objects 下查找相应的 JSON 对象。例如当使用 key_entered:

geoQuery.on("key_entered", function(key, location, distance) {
  console.log(key + " entered query at " + location + " (" + distance + " km from center)");
  ref.child("objects").child(key).once("value", function(snapshot) {
    console.log(snapshot.val());
  });
});