So che questa domanda è un po 'vecchia. Ma penso che la risposta non copra il problema principale: come ottenere le informazioni sulla paginazione e come mantenere le funzionalità delle risorse per l'elenco degli oggetti.
Avete fondamentalmente due soluzioni, passate i dati di paginator in intestazioni nel messaggio di trasformazione o utilizzate $ http e quindi istanziate manualmente gli elementi.
messaggio 1.Transform
Here i ridefinire query per inserire i dati di impaginazione nelle intestazioni.
Le intestazioni non sono un array: è "headersGetter" che restituisce l'intestazione chiamando le intestazioni ('Header-Name') e restituisce l'oggetto interno chiamando le intestazioni(). Devo impostare l'intestazione in minuscolo.
var PAGINATION_TOTAL = 'pagination-total-elements';
var PAGINATION_SIZE = 'pagination-size';
...
.factory('BeerResourceFactory', function($resource, API_URI) {
return $resource(API_URI + '/beer/:id',
{'id': '@id'},
{
'update': {method: 'PUT'},
'query' : {method: 'GET', isArray:true, transformResponse : function(data, headers) {
var jsonData = JSON.parse(data);
headers()[PAGINATION_TOTAL] = jsonData.totalElements;
headers()[PAGINATION_SIZE] = jsonData.size;
return jsonData.content;
}}
});
})
Dopo che io definisco servizio che incapsula questo e prendere impaginazione dalle intestazioni. All'improvviso non possiamo usare $ promise.then() e tornare indietro perché la promessa ottiene solo risultato come argomento e non come headersGetter, quindi dobbiamo usare il callback ordinario e creare la propria promessa.
.service('beerService', function(BeerResourceFactory, $q) {
this.query = function(filter) {
var defer = $q.defer();
BeerResourceFactory.query(filter, function(result, headers) {
var promiseResult = {
beers: result,
paging: {
totalItems: headers(PAGINATION_TOTAL),
perPage: headers(PAGINATION_SIZE)
}
};
defer.resolve(promiseResult);
});
return defer.promise;
}
2.Tramite $ http e creare un'istanza della risorsa
Quando si usa $ http invece di risorse, non v'è problema che si vuole ancora utilizzare gli elementi della matrice come istanze di risorse e di essere in grado di chiamare $ salva/$ elimina, quindi è possibile istanziarli manualmente. Qui puoi anche usare la normale promessa come usuale.
.service('beerService', function($http, BeerResourceFactory, API_URI) {
this.query = function(filter) {
return $http.get(API_URI + '/beer', {params: filter})
.then(function(response) {
var transformedList = response.data.content.map(function(element) {
return new BeerResourceFactory(element);
});
return {
beers: transformedList,
paging: {
totalItems: response.data.totalElements,
perPage: response.data.size
}
};
});
};
Preferirei seconda soluzione, perché è più semplice.
TransformResponse è ciò di cui ho bisogno, grazie. –
@joakimbl, Hai qualche idea su come ottenere i valori successivo, precedente o di conteggio? Ho la stessa risposta di cui ho parlato e le tue soluzioni sono esattamente ciò di cui ho bisogno, l'unico problema è che uso "count" per renderizzare il pager, quindi ho bisogno di ottenerlo in qualche modo. – Sergey
Bene, puoi ottenerli nella funzione transformResponse (ad es. JSON.parse (dati) .count) - ma non sono sicuro di come li avresti passati oltre. Probabilmente dovresti semplicemente usare il servizio $ http. – joakimbl