Интеграция Geofire с существующей базой данных firebase

Я просмотрел примеры github Fish для Geofire, но все еще не понимаю как реализовать это в моем приложении. Мой вариант использования: мое приложение показывает события / встречи зарегистрированным пользователям. В настоящее время в моем приложении у меня есть прослушиватель firebase в ссылке firebase (события).

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

В настоящее время при начальной загрузке клиентское приложение извлекает весь объект по ссылке событий, а затем данные каждого события отображаются пользователю в таблице (каждая строка - событие).

Я понимаю, что с geofire я могу использовать функцию set () для сохранения каждого ключа события вместе с его геолокацией [lat, lng]. А затем с помощью запроса я могу получить список ключей событий, которые попадают в указанный радиус для текущего местоположения пользователя (геолокация html5). Но что мне делать с ключами, поскольку к ним не прикреплены данные, могу ли я установить индивидуальных "on" слушателей для каждого ключа события в ссылке "События"? а затем отображать данные о событиях?


person jasan    schedule 25.11.2016    source источник


Ответы (1)


Когда вы используете Geofire, вы получаете две ветви в вашем дереве JSON: одна с геоданными для объектов, а другая с фактическими данными.

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

Когда вы запускаете GeoQuery для узла geodata, вы получаете обратно ключи объектов, которые попадают в диапазон этого запроса. Так, например, objectId2 и objectId3.

Затем вы используете этот ключ для поиска соответствующего объекта JSON в objects. Например, при использовании 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());
  });
});
person Frank van Puffelen    schedule 25.11.2016
comment
Если новые ключи событий добавляются в ссылку geofire с помощью (set ()) после создания вышеуказанного запроса в клиентском приложении, и если он попадает в радиус, будет ли запрос key_entered обнаруживать добавление и извлекать ключ? Кроме того, тот же вопрос для удаляемого ключа события, будет ли key_exited для ключевого триггера? - person jasan; 26.11.2016
comment
Если новые ключи связаны с местоположением, которое находится в диапазоне активного GeoQuery, он сработает key_entered. Если у вас возникли проблемы с выполнением этой работы, поделитесь минимальным кодом, воспроизводящим проблему. - person Frank van Puffelen; 26.11.2016