Jestem całkiem nowy w Angular, więc może pytam o niemożliwe, ale w każdym razie, oto moje wyzwanie.Rozwiązanie do przesyłania strumieniowego JSON za pomocą oboe.js w AngularJS?
Ponieważ nasz serwer nie może paginować danych JSON, chciałbym przesłać strumień JSON i dodać go strona po stronie do modelu kontrolera. Użytkownik nie musi czekać na załadowanie całego strumienia, dlatego odświeżam widok każdego rekordu X (stronicowania).
Znalazłem oboe.js do analizy strumienia JSON i dodałem go za pomocą altanki do mojego projektu. (altanka instaluje obój - zapisz).
Chcę zaktualizować model kontrolerów podczas przesyłania strumieniowego. Nie użyłem implementacji pomas z $ q, ponieważ istnieje tylko jeden .resolve (...) i chcę, aby wiele stron danych było ładowanych przez strumień, więc $ digest musi zostać wywołane z każdą stroną. Relaksującego usługa, która nazywa się/usługa/zadania/search
I stworzył fabrykę z funkcji wyszukiwania, które ja nazywam od wewnątrz kontrolera:
'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();
});
}
};
});
Mój kontroler:
'use strict';
angular.module('myStreamingApp')
.controller('MyCtrl', function($scope, Stream) {
$scope.data = [];
Stream.search('tasks', $scope);
});
To wszystko szwy do pracy. Po chwili jednak system działa wolno i połączenie http nie kończy się po odświeżeniu przeglądarki. Również przeglądarka (chrome) ulega awarii, gdy załadowanych jest zbyt wiele rekordów. Być może jestem na niewłaściwym torze, ponieważ przekazanie zakresu do funkcji wyszukiwania fabrycznego nie "czuje" się dobrze i podejrzewam, że wywołanie $ digest na tym zakresie sprawia mi kłopoty. Wszelkie pomysły na ten temat są mile widziane. Zwłaszcza jeśli masz pomysł na wdrożenie go gdzie fabryka (lub usługa) może powrócić obietnicę i mogę użyć
$scope.data = Stream.search('tasks');
w kontrolerze.