【问题标题】:Fetch list of restaurants in user's proximity using Firebase-GeoFire使用 Firebase-GeoFire 获取用户附近的餐馆列表
【发布时间】:2016-07-26 16:16:30
【问题描述】:

我有一个餐厅列表,每个餐厅都有一个存储在 GeoFire 中的固定位置。现在我想在用户位置的固定半径内显示餐厅。我如何使用 GeoFire 来实现这一点。这里的文档https://github.com/firebase/geofire-js/blob/master/docs/reference.md#geofiresetkeyorlocations-location 主要建议使用 key_entered、key_exited 等处理 geofire“键”移动的解决方案。但我无法弄清楚如何访问附近的键。

我的控制器代码如下:

var ref = firebase.database().ref();
var geoFire = new GeoFire(ref.child("geofire"));
var posOptions = {timeout: 10000, enableHighAccuracy: false};
$cordovaGeolocation.getCurrentPosition(posOptions).then(function (position) {
$scope.rest= [];
$scope.filteredRest = [];
var geoQuery = geoFire.query({
  center: [position.coords.latitude,  position.coords.longitude],
  radius: 15
});
geoQuery.on("key_entered", function(key, location, distance) {
  console.log(key);
  $scope.filteredRest.push(key);
});
geoQuery.on("ready", function() {
  geoQuery.cancel();
});
console.log($scope.filteredRest);

密钥打印在控制台上,但未推送到过滤的Rest 数组。

我希望在以下链接中实现“示例用法”: https://github.com/firebase/geofire-java#example-usage

有类似的问题,但大多数都在 ios/swift 中,答案不是很丰富。我正在使用 GeoFire-JavaScript。任何帮助将不胜感激。

【问题讨论】:

  • key_entered 事件也会针对非移动键触发。它将针对范围内的所有键“立即”触发,然后针对进入该范围的每个键触发。你有没有尝试过?
  • 好的,但这会让我访问所有触发事件的键吗?不完全确定返回的 GeoCallbackRegistration 是什么。
  • 您必须通过挂钩 key_entered 来构建密钥集合。如果您想知道所有 initial 键何时被触发,您可以挂钩 ready 事件:github.com/firebase/geofire-js/blob/master/docs/…
  • 我可以通过 key_entered 访问单个密钥,但我无法将这些密钥存储为一个集合。你能举出任何例子吗?我认为这个问题是由于 firebase 的异步性质造成的。
  • 确实如此。在这个阶段,您可以提供一个minimal, complete example 来重现您的问题。在 Stack Overflow 上,提供示例链接是题外话。

标签: javascript firebase firebase-realtime-database geofire


【解决方案1】:

要在所有初始键同步时进行处理,请将代码放入ready 处理程序。例如,假设您要打印所有初始键:

var ref = firebase.database().ref();
var geoFire = new GeoFire(ref.child("geofire"));
var posOptions = {timeout: 10000, enableHighAccuracy: false};
$cordovaGeolocation.getCurrentPosition(posOptions).then(function (position) {
$scope.rest= [];
$scope.filteredRest = [];
var geoQuery = geoFire.query({
  center: [position.coords.latitude,  position.coords.longitude],
  radius: 15
});
geoQuery.on("key_entered", function(key, location, distance) {
  $scope.filteredRest.push(key);
});
geoQuery.on("ready", function() {
  geoQuery.cancel();
  console.log($scope.filteredRest);
});

【讨论】:

  • 这很简单!谢谢您的帮助!你是MVP!
  • 大家好,我不是故意粗鲁,但我正在尝试做一些非常相似的事情,但我无法解决,你能看看我的帖子吗? stackoverflow.com/questions/42462088/…
  • Javascript 有可能吗?搜索静态(固定)位置附近的键(键列表) - 这些是预先添加到 Firebase 数据存储中的。注意:不使用 'key_entered' 因为 'key_entered' 仅在新的或位置更新时触发。以前添加的位置但在给定的半径范围内呢?怎么可能??
猜你喜欢
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
相关资源
最近更新 更多