Sono abbastanza nuovo per Angular quindi forse sto chiedendo l'impossibile ma comunque, ecco la mia sfida.Una soluzione per lo streaming di JSON che utilizza oboe.js in AngularJS?
Poiché il nostro server non è in grado di impaginare i dati JSON, mi piacerebbe eseguire lo streaming del JSON e aggiungerlo pagina per pagina al modello del controllore. L'utente non deve attendere il caricamento dell'intero stream, quindi aggiorno la vista di ogni record X (pagine).
Ho trovato oboe.js per analizzare il flusso JSON e l'ho aggiunto utilizzando bower al mio progetto. (bower installa oboe --save).
Desidero aggiornare il modello di controller durante lo streaming. Non ho usato l'implementazione $ q di pomises, perché c'è solo un .resolve (...) possibile e voglio più pagine di dati caricate tramite lo stream in modo che il $ digest debba essere chiamato con ogni pagina. Il servizio di riposante che si chiama è/servizio/attività/ricerca
ho creato una fabbrica con una funzione di ricerca che io chiamo dall'interno del controller:
'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();
});
}
};
});
mio regolatore:
'use strict';
angular.module('myStreamingApp')
.controller('MyCtrl', function($scope, Stream) {
$scope.data = [];
Stream.search('tasks', $scope);
});
Tutto sembra funzionare. Dopo un po ', tuttavia, il sistema diventa lento e la chiamata http non termina dopo aver aggiornato il browser. Anche il browser (chrome) si blocca quando ci sono troppi record caricati. Forse sono sulla strada sbagliata perché passare l'ambito alla funzione di ricerca di fabbrica non "sento" correttamente e sospetto che chiamare il digest di $ su quel campo mi stia causando problemi. Tutte le idee su questo argomento sono benvenute. Soprattutto se avete un'idea sulla sua attuazione in cui la fabbrica (o servizio) potrebbe tornare una promessa e ho potuto usare
$scope.data = Stream.search('tasks');
nel controller.