我对Angular来说很新,所以也许我在问不可能,但无论如何,这是我的挑战。在AngularJS中使用oboe.js流式传输JSON的解决方案?
由于我们的服务器无法对JSON数据进行分页,因此我想将JSON流式传输并将其逐页添加到控制器的模型中。用户不必等待整个流加载,因此我刷新每个X(pagesize)记录的视图。
我发现了解析JSON流的oboe.js并将它添加到我的项目使用鲍尔。 (凉亭安装双簧管 - 保存)。
我想在流式传输过程中更新控制器型号。我没有使用pomises的$ q实现,因为只有一个.resolve(...)可能,并且我想要通过流加载多页数据,因此需要在每个页面中调用$ digest。这就是所谓的RESTful服务是/服务/任务/搜索
我创建了一个工厂,一个搜索功能,我从控制器内调用:
'use strict';
angular.module('myStreamingApp')
.factory('Stream', function() {
return {
search: function(schema, scope) {
var loaded = 0;
var pagesize = 100;
// JSON streaming parser oboe.js
oboe({
url: '/service/' + schema + '/search'
})
// process every node which has a schema
.node('{schema}', function(rec) {
// push the record to the model data
scope.data.push(rec);
loaded++;
// if there is another page received then refresh the view
if (loaded % pagesize === 0) {
scope.$digest();
}
})
.fail(function(err) {
console.log('streaming error' + err.thrown ? (err.thrown.message):'');
})
.done(function() {
scope.$digest();
});
}
};
});
我的控制器:
'use strict';
angular.module('myStreamingApp')
.controller('MyCtrl', function($scope, Stream) {
$scope.data = [];
Stream.search('tasks', $scope);
});
这一切接缝工作。不过一段时间后,系统变慢,并且在刷新浏览器后http呼叫不会终止。当加载的记录太多时,浏览器(chrome)也会崩溃。 也许我在错误的轨道上,因为将范围传递给工厂搜索功能并不“感觉”正确,我怀疑在该范围调用$摘要给我带来麻烦。任何关于这个问题的想法都是受欢迎特别是如果你有一个关于在工厂(或服务)可能返回承诺的地方实施它的想法,并且我可以在控制器中使用
$scope.data = Stream.search('tasks');
。