【问题标题】:Performance limitations of angular filters on mobile移动端角度滤波器的性能限制
【发布时间】:2015-05-29 15:50:38
【问题描述】:

我有 3000 个对象,每个对象都有许多属性,创建了一个 72,000 行 2MB 的 JSON 文件。

JSON 实际上是一个对象数据库,需要通过文本搜索过滤器以及通过将值与值数组进行匹配来进行过滤。

在初始视图中,我在 service 中执行此操作:

  this.loadJsonFile = function(url, process) {
    var defer = $q.defer();
    if (angular.isDefined(cache[url])) {
      if (angular.isDefined(cache[url]['then'])) {
        return cache[url];
      }
      defer.resolve(cache[url]);
      return defer.promise;
    }

    $http.get(url).success(function(data) {
      if (process) {
        data = process(data);
      }
      cache[url] = data;
      defer.resolve(data);
    }).error(function(err){
      defer.reject(err);
    });
    cache[url] = defer.promise;
    return defer.promise;
  };

  this.getExercises = function() {
    return this.loadJsonFile('data/exercises.json');
  };

在我的控制器中,所有结果都通过以下方式暴露给$scope

api.getExcercises().then(function(data) {
  $scope.allExercises = data.results;
});

我将结果限制为:

$scope.limit = 56;

以前我每次需要搜索时都避免调用服务器,因为调用次数会非常多!这在有足够电量的 iPad Air 2 和 iPhone 6 上运行良好,但在 Galaxy Tab 上却很差。

我需要有关仅将有限数量的结果暴露给$scope 的策略的帮助,因为我认为被过滤和搅动的大量数据导致我的表现不佳。只要结果暴露给$scope(在加载屏幕之后说)性能非常出色,我就可以运行搜索/过滤功能并打破实时搜索功能的无缝性质。

查看服务器情况,我并不热衷于访问我的 Parse.com 服务器,因为它对 Angular 不友好,但 Firebase 的异步特性可能会起作用。我只是上传了我的 JSON 并通过以下方式将数据附加到 $scope:

var ref = new Firebase("https://URL_HERE.firebaseio.com/results"); 
$scope.allExercises = $firebaseArray(ref);

这与我的本地 JSON 方法非常相似。但是我想知道是否可以使用 Firebase 执行以下操作?

  1. 加载按名称排序的初始 50 个结果。
  2. 在文本搜索中键入时,会执行查询并传递 $scope 的结果。
  3. 向过滤器数组添加值时,会根据暴露给 $scope 的值和结果查询 Firebase 上的数据。

【问题讨论】:

  • 所以我构建了一个 ionic 应用程序,需要使用一个 118MB 的 JSON 文件,其中包含超过 18000 个条目。我所做的就是将它全部放入一个 mongo DB 中,然后查询它。它非常快,并且与 nodejs/express 服务器配合得非常好,或者您可以直接从应用程序查询数据库。我没有研究过 firebase,但如果您正在寻找一个快速、直接且对 javascript 友好的数据库,我会查看 mongolab.com
  • 杰西非常感谢您的评论。你能扩展一下你的服务器设置吗?我之前没用过nodejs/express。
  • 是的,所以我有一个节点服务器。 Express 用于制作路线。在您连接到数据库的节点服务器中,创建一个类似 www.website.com/api/:param 的路径。传入参数,用于查询mongo数据库。我会在这个开始。您几乎为您的 mongo DB thejackalofjavascript.com/… 制作了一个宁静的 api
  • 都是javascript和JSON对象,你也可以使用mongo来运行服务器端的函数。因此,一旦将数据传递到节点服务器,您就可以在将其发送到客户端之前对其进行排序
  • 如果你想看看使用它的应用程序如何执行我的应用程序是Sidekick,用于 Play 商店中的精英危险。对于拥有如此庞大的数据库,查询实际上非常快。到目前为止,我的服务器托管在 heroku 上,我的数据库托管在 mongolab 上。

标签: javascript json angularjs firebase ionic-framework


【解决方案1】:

请花点时间查看Firebase guide。它会阻止很多问题,这些问题已经在那里回答了。

  1. 是的,类似:

    ref.orderByChild('name').limitToFirst(50);
    
  2. 您必须运行如下查询:

    ref.orderByChild('name').startAt(searchString).limitToFirst(50);
    

    请注意,Firebase 查询不支持通配符搜索。请参阅guide's section on querying 了解更多信息。

【讨论】:

  • 谢谢弗兰克,但这只是回答了我问题的最初部分——我已经使用了这段代码,它工作正常。所以firebase无法在服务器上查询/过滤?这都是在客户端完成的?
  • 我的代码展示了如何执行类似“开头”的查询,该查询将在服务器上执行(只要您在name 上定义了索引)。通配符和模糊搜索目前不是 Firebase 查询功能的一项功能。
【解决方案2】:

您的问题是您的数据上的观察者数量巨大,而使用自动过滤器会创建更多的观察者,这些观察者会被调用两次。

我建议你实现一个数据库和一个搜索功能。

对于免费的解决方案(因为 FireBase 是付费的),我建议您使用带有 cordova sqlite plugin 的 sqlite 数据库

这在 android 和 ios 上运行良好,并且在 Windows Phone 上也有一些工作;)

【讨论】:

  • 每次我的应用程序有新更新时,我都会更改/扩展此数据库。此外,我一直在考虑远程选项,这样我就可以更新源数据而无需更新应用程序,因为 Apple 的审查时间让我快要死了!!
  • 这是一个解决方案,但会增加从 App 到 WebServices 的查询数量。我个人在我的应用上管理一个同步服务。
  • 对于我的 mongoDB,我必须每 24 小时完全重新制作一次,因为那是我获得新 JSON 文件的时候。所以我有一个批处理脚本,它删除集合并从 JSON 文件重新制作它。超级简单
猜你喜欢
  • 2015-01-08
  • 1970-01-01
  • 2017-06-09
  • 2021-02-27
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2015-07-27
相关资源
最近更新 更多