2015-05-29 3 views
0

У меня есть 3000 объектов, каждый из которых обладает рядом свойств, создавая файл JSON длиной 72 000 строк 2 МБ.Ограничения производительности угловых фильтров на мобильном телефоне

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; 

Раньше я оставался подальше от вызова сервера y раз мне нужно искать, так как количество звонков будет очень высоким! Это хорошо работает на iPad Air 2 и iPhone 6, где есть много энергии, однако на Galaxy Tab он довольно беден.

Мне нужна помощь по стратегии только для того, чтобы показывать только ограниченное количество результатов на $scope, поскольку я думаю, что количество сдвига фильтруемых и опрокинутых данных приводит к моей низкой производительности. Я в порядке с выполняемой функцией поиска/фильтра и нарушением целостности функции поиска в реальном времени, пока результаты подвергаются $scope (по словам экрана загрузки), производительность очень резкая.

Оглядываясь на ситуацию с сервером, я не заинтересован в том, чтобы поражать мой сервер Parse.com, поскольку он не является дружественным к угловому, однако Async-характер Firebase может работать. Я просто загрузил свой JSON и прикрепил данные в $ объеме через:

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

, который работает довольно аналогично мой локальный метод JSON. Однако мне интересно, можно ли использовать Firebase следующим образом?

  1. Загрузить начальные 50 результатов, упорядоченных по имени.
  2. При наборе текста в текстовом поиске выполняется запрос, а в поле $ scope передаются результаты.
  3. При добавлении значений в фильтр-массив данные о Firebase запрашиваются относительно значений и результатов, открытых для $scope.
+0

Итак, я построил и ионное приложение и должен был использовать файл JSON размером 118 МБ с более чем 18 000 записей. То, что я сделал, это все, что я делал в БД Mongo, и затем спросил его. Это очень быстро и очень хорошо работает с узлом/express server или вы можете запросить базу данных непосредственно из приложения. Я не смотрел в firebase, но если вы ищете быструю, прямую и javascript-дружественную базу данных, я бы посмотрел mongolab.com –

+0

Jess большое спасибо за ваш комментарий. Можете ли вы немного расширить свою настройку сервера? Я раньше не использовал nodejs/express. – Taylorsuk

+1

Да, у меня есть сервер узлов. Экспресс используется для маршрутизации. На узловом сервере, который вы подключаетесь к своей базе данных, создайте путь, например, www.website.com/api/:param. Параметр берется и используется для запроса базы данных mongo. Я бы взял добычу, чтобы начать. В значительной степени вы делаете спокойный api для своего mongo DB http://thejackalofjavascript.com/nodejs-restify-mongolab-build-rest-api/ –

ответ

2

Пожалуйста, потребуется некоторое время, чтобы пройти через Firebase guide. Это предотвратит многие вопросы, на которые они уже ответили.

  1. Да, что-то вроде:

    ref.orderByChild('name').limitToFirst(50); 
    
  2. Вы должны были бы выполнить запрос, например:

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

    Обратите внимание, что Firebase выполнение запроса не поддерживает поиск подстановочных. См. guide's section on querying для получения дополнительной информации.

+0

Спасибо, Фрэнк, однако это только отвечает на начальную часть моего вопроса - я использовал этот код, и он отлично работает. Так что firebase не может запросить/фильтровать на сервере? это все сделано на стороне клиента? – Taylorsuk

+0

В моем коде показано, как выполнить запрос «начинается с», который будет выполняться на сервере (если вы указали индекс в 'name'). Подстановочные и нечеткие запросы в настоящее время не являются особенностью функции запроса Firebase. –

1

Ваша проблема заключается в том, что количество ваших наблюдателей велико для ваших данных, а автоматические фильтры создают еще больше наблюдателей, которые вызывается дважды.

Предлагаю вам реализовать базу данных и возможности поиска.

Для свободного решения (как FireBase оплачивается) Я предлагаю вам использовать базу данных SQLite с cordova sqlite plugin

Это работает очень хорошо на андроид и КСН, и с некоторой работы на Windows Phone тоже;)

+0

Каждый раз, когда появляется новое обновление моего приложения, я буду менять эту базу данных/расширять ее. Также я рассматриваю удаленные параметры, чтобы обновлять исходные данные без необходимости обновлять приложение, так как время проверки Apple убивает меня !! – Taylorsuk

+0

Это решение, но увеличит количество запросов от приложения до WebServices. Я лично управляю службой синхронизации в своем приложении. – aorfevre

+0

с моим mongoDB Я должен полностью переделать его каждые 24 часа, потому что это когда я получаю новый файл JSON. Поэтому у меня есть пакетный скрипт, который отбрасывает коллекцию и переделывает ее из файла JSON. Супер легкий –