我什么时候知道 GeoFire 已完成加载,因为它是基于事件的触发器

2024-04-21

因此,我使用 GeoFire 和 AngularFire 来填充我的 ng-repeat 项目列表。有一个离子拉动来刷新列表。因此,用户拉动它并获取当前更新的位置并刷新列表(调用 GeoFire 来重新填充列表)。

$scope.doRefresh = function() {
  if ($scope.doneLoading) {
    $scope.useCurrentLocation().then(function() {
      $scope.userCurrentLocation = {
        lat: geoLocation.getGeolocation().lat,
        lng: geoLocation.getGeolocation().lng
      }

      angular.forEach($scope.tasks, function(child) {
        child.$destroy();
      });

      setupTaskListing();

      $scope.$broadcast('scroll.refreshComplete');
    })
  }
}

function setupTaskListing() {
  console.log("setupTask is being called");
  if ($scope.tasks.length > 0) {
    console.log("task is not empty!");
    $scope.tasks = [];
  }
  if ($scope.query) {
    console.log("$scope.query is not empty:" + $scope.query);
    $scope.query.cancel();
  }
  var radiusInMiles = ($scope.radius) * 1.60934;
  $scope.query = taskService.setGeoQuery($scope.userCurrentLocation.lat, $scope.userCurrentLocation.lng, radiusInMiles); //My service to set Geo Query.
  var geoQueryCallback = $scope.query.on("key_entered", "SEARCH:KEY_ENTERED");
}

$scope.$on("SEARCH:KEY_ENTERED", function(event, key, location, distance) {

  //my service to get a single task. It return a firebase object. So I use $loaded
  var task = taskService.getTask(key);
  task.$loaded().then(function(data) {            
    data.distance = parseInt(distance * 0.621371192);
    data.id = data.$id;
    $scope.tasks.push(data);
  });
});

正如您所看到的上面的代码,非常简单。 doRefresh() 调用 setupTaskListing()。它设置了 geoQueryCallback,当按键输入事件触发时,将新数据推送到 $scope.tasks 数组中。所以它有效。

但这个 GeoFire 结构的问题是......我不知道所有任务何时完成进入半径......所以我无法设置加载程序并在半径内没有数据时进行提示。当没有数据输入时, key_entered 事件永远不会触发,所以我永远不会知道是否有数据。它可能是没有数据或 GeoFire 仍在加载。如果我将 loader.hide() 方法放在 $scope.$on 内,那么当实际上没有数据时它永远不会触发。所以我的屏幕将永远加载。理想的用户体验应该是停止加载并提示人们增加搜索半径。如果我将 loader.hide() 放在 $scope.$on 之外,并设置 $timeout 来调用它。在 $timeout 运行之前,GeoFire 需要更长的时间来加载数据。因此,用户将提示更改半径屏幕,然后闪回到实际列表。再次糟糕的用户体验。那么...我的选择是什么?我可以在 GeoFire 中使用某种承诺吗?


Geofire 在以下情况下触发“查询就绪”事件:

所有当前数据已从服务器加载,并且所有初始事件已被触发。

See Geofire 文档的这一部分 https://github.com/firebase/geofire-js/blob/master/docs/reference.md#geoqueryoneventtype-callback.

那里的代码示例:

var onReadyRegistration = geoQuery.on("ready", function() {
  console.log("GeoQuery has loaded and fired all other events for initial data");
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我什么时候知道 GeoFire 已完成加载,因为它是基于事件的触发器 的相关文章

随机推荐

  • 如何配置 prometheus-operator 从 Kubernetes 上的 cAdvisor 收集?

    我在用普罗米修斯操作员 https github com coreos prometheus operator管理一个普罗米修斯 https prometheus io 部署在我的库伯内斯 https kubernetes io 簇 该设置
  • VSTO - 存储 Excel 工作簿设置的最佳位置

    我有一个用 VBA 实现的旧版 Excel AddIn 我正在使用 VSTO 慢慢将其移植到 net 使用此插件 我将每个工作簿的设置存储在隐藏工作表中 我想知道是否有更好的方法使用 VSTO 来做到这一点 您可以使用自定义文档属性 htt
  • 解析器中的运算符优先级和结合性 (Haskell)

    我正在尝试扩展递归下降解析器来处理新运算符并使它们正确关联 最初只有四个运算符 并且它们都具有相同的优先级 我正在查看的函数是 parseExpRec 函数 parseExpRec Exp gt Token gt Exp Token par
  • MySQL - 选择最近 10 位作者的最新帖子

    我有一个包含许多不同作者的博客文章的表 我想做的是显示 10 位最新作者各自的最新帖子 每个作者的帖子只是按顺序添加到表中 这意味着单个作者可能会发布多篇帖子 我花了很多时间想出一个查询来做到这一点 这给了我最后 10 个唯一的作者 ID
  • 使用 Gradle,如何打印每个任务执行所需的时间?

    现在 对于频繁运行的 gradle 目标之一 输出如下所示 DataPlanner clean common clean server clean simulator clean util clean util compileJava ut
  • 美丽汤无法“获取”完整网页

    我正在使用 BeautifulSoup 来解析来自的一堆链接但它并没有提取我想要的所有链接 为了尝试找出原因 我将 html 下载到 web page html 并运行 soup BeautifulSoup open web page ht
  • 在 Flash AS3 中捕获未处理的 IOErrorEvent

    错误 2044 未处理的 IOErrorEvent text 错误 2036 从不加载 完全的 这就是我每次尝试使用加载器加载不存在的图像时看到的情况 我正在获取 URL 列表 但无法验证它们是否指向任何有用的内容 每当遇到 404 时 它
  • URL 重写破坏了 CSS 链接

    我使用以下设置进行网址重写 RewriteEngine On RewriteCond REQUEST FILENAME d RewriteCond REQUEST FILENAME f RewriteRule index php url 1
  • October CMS:如何扩展后端用户的角色范围

    我已经能够延长Backend Models User类并添加一个范围查询方法以仅检索超级用户 public function boot User extend function model model gt addDynamicMethod
  • 如何自动链接本地npm包?

    我正在构建两个相互依赖的私有 npm 包 说我有 project my commons package json name my commons version 0 0 1 my server package json dependenci
  • Beaglebone Black 上的 GPIO

    我目前遇到了 Beaglebone black GPIO 引脚的问题 我正在寻找一种正确的方法来读取 C 中的 GPIO 引脚 p8 4 的值 如果我理解正确的话 我尝试使用一个库 该库使用了在引入设备树之前不支持的旧方法 我尝试寻找其他解
  • 如果方法只需要 ajax 调用,会返回什么错误?

    如果操作期望仅通过 AJAX 使用 但在没有正确的 ajax 标头的情况下调用 则操作应返回什么 HTTP 状态 我觉得我应该指出一些错误 但我真的找不到合适的错误 我想最好是 405 Method not allowed 但是如果例如 a
  • PowerShell 中的“net use”不指定驱动器

    通过 net use 您可以执行以下操作 net use server user domian username 然后 它会提示输入密码 并且使用任何程序 cmd Explorer Word 等 与该服务器建立的任何进一步 CIFS 连接都
  • 验证 TextBox 中的文本更改

    我已经在 WinForm 中的文本框上实现了验证规则 并且效果很好 但是 只有当我跳出该字段时 它才会检查验证 我希望它在框中输入任何内容以及每次内容发生变化时立即进行检查 我还希望它在 WinForm 打开后立即检查验证 我记得最近通过设
  • 一页上有多个夏季笔记 div

    我正在尝试获取特定夏季笔记 div 的代码 其中单个页面上有多个笔记 div 我的暑假笔记是用 php 从数据库创建的 如下所示 div class tab content div class tab pane div class summ
  • 如何在大窗口上优化窗口聚合?

    我在 Spark 2 4 4 中使用带有大窗口的窗口函数 例如 Window partitionBy id orderBy timestamp 在我的测试中 我有大约 70 个不同的 ID 但我可能有大约 200 000 行 ID 如果没有
  • 检索 AR 模型的所有关联属性?

    您认为检索 AR 模型所有关联的所有属性的最佳方法是什么 即 假设我们有模型Target class Target lt ActiveRecord Base has many countries has many cities has ma
  • 使用推断的 (?) 类型克隆 std::iter::Map

    我在以紧凑的方式克隆地图时遇到问题 extern crate itertools num use itertools num linspace fn main 440Hz as wave frequency middle A let fre
  • 没有 GameKit 的 iOS 蓝牙

    我已经知道使用 GameKit 我只能连接到运行相同应用程序的其他 iOS 设备 但我想连接到 Parallaz EasyBluetooth 芯片来发送和接收命令 因此我需要不同的解决方案 我想有一些针对越狱设备的库 但我不知道 你能给我一
  • 我什么时候知道 GeoFire 已完成加载,因为它是基于事件的触发器

    因此 我使用 GeoFire 和 AngularFire 来填充我的 ng repeat 项目列表 有一个离子拉动来刷新列表 因此 用户拉动它并获取当前更新的位置并刷新列表 调用 GeoFire 来重新填充列表 scope doRefres