我有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执行以下操作?
$scope
向结果显示Firebase上的数据。答案 0 :(得分:2)
请花一些时间浏览Firebase guide。它会阻止很多问题,这些问题已在那里得到解答。
是的,比如:
ref.orderByChild('name').limitToFirst(50);
您必须运行如下查询:
ref.orderByChild('name').startAt(searchString).limitToFirst(50);
请注意,Firebase查询不支持通配符搜索。有关详细信息,请参阅guide's section on querying。
答案 1 :(得分:1)
您的问题是,您的数据中观察者的数量是巨大的,并且拥有自动过滤器会创建更多被调用两次的观察者。
我建议您实现数据库和搜索功能。
对于免费解决方案(支付FireBase),我建议您使用带有cordova sqlite plugin
的sqlite数据库这在android和ios上工作得很好,并且在Windows Phone上也有一些工作;)