我對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');
。