Ich bin ziemlich neu in Angular, also frage ich vielleicht das Unmögliche, aber trotzdem, hier ist meine Herausforderung.Eine Lösung für das Streaming von JSON mit oboe.js in AngularJS?
Da unser Server JSON-Daten nicht paginieren kann, möchte ich den JSON streamen und ihn Seite für Seite zum Modell des Controllers hinzufügen. Der Benutzer muss nicht auf das Laden des gesamten Streams warten, daher aktualisiere ich die Ansicht für alle X-Datensätze (Seitengröße).
Ich habe oboe.js zum Parsen des JSON-Streams gefunden und mit Bower zu meinem Projekt hinzugefügt. (Bower installieren Oboe - Save).
Ich möchte das Controller-Modell während des Streaming aktualisieren. Ich habe die $ q-Implementierung von Pomises nicht verwendet, da nur eine .resolve (...) möglich ist und ich möchte, dass mehrere Seiten über den Stream geladen werden, so dass der $ digest mit jeder Seite aufgerufen werden muss. Der erholsamen Service, der genannt wird, ist/service/Aufgaben/Suche
ich eine Fabrik mit einer Suchfunktion erstellt, die ich aus dem Controller nennen:
'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();
});
}
};
});
Mein Controller:
'use strict';
angular.module('myStreamingApp')
.controller('MyCtrl', function($scope, Stream) {
$scope.data = [];
Stream.search('tasks', $scope);
});
Es scheint alles zu funktionieren. Nach einer Weile wird das System jedoch langsam und der http-Aufruf wird nach der Aktualisierung des Browsers nicht beendet. Auch der Browser (Chrome) stürzt ab, wenn zu viele Datensätze geladen sind. Vielleicht bin ich auf dem Holzweg, weil das Überschreiten des Bereichs auf die Fabriksuchfunktion nicht richtig funktioniert und ich vermute, dass das Aufrufen des $ digest auf diesem Bereich mir Probleme bereitet. Irgendwelche Ideen zu diesem Thema sind willkommen. Vor allem, wenn Sie eine Idee haben, auf deren Umsetzung, wo die Fabrik (oder Service) ein Versprechen zurückkehren konnte und ich
$scope.data = Stream.search('tasks');
in der Steuerung nutzen könnten.