移动设备上角度过滤器的性能限制

时间:2015-05-29 15:50:38

标签: javascript json angularjs firebase ionic-framework

我有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上的数据。

2 个答案:

答案 0 :(得分:2)

请花一些时间浏览Firebase guide。它会阻止很多问题,这些问题已在那里得到解答。

  1. 是的,比如:

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

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

    请注意,Firebase查询不支持通配符搜索。有关详细信息,请参阅guide's section on querying

答案 1 :(得分:1)

您的问题是,您的数据中观察者的数量是巨大的,并且拥有自动过滤器会创建更多被调用两次的观察者。

我建议您实现数据库和搜索功能。

对于免费解决方案(支付FireBase),我建议您使用带有cordova sqlite plugin

的sqlite数据库

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