2015-01-26 8 views
11

Per impostazione predefinita, lo $resource.query() è configurato per prevedere una matrice di oggetti che diventano oggetti $resource. Per accogliere paging in modo piacevole, rilassante, ho il mio GET /api/widgets endpoint istituito per restituire il seguente oggetto:

{ 
    currentPage: 1, 
    perPage: 20, 
    totalItems: 10039, 
    items: [{...}, {...}, {...}] 
} 

C'è un modo per fare in modo che angolare sapranno che la proprietà items è l'array di articoli da essere oggetti $resource?

risposta

22

è necessario specificare la propria azione personalizzata.

immagino il codice simile a questa:

factory('Widget', function($resource) { 
    return $resource('/api/widgets'); 
}); 

Change a questo:

factory('Widget', function($resource) { 
    return $resource(/api/widgets, null, { 
    query: { 
     method: 'GET', 
     isArray: true, 
     transformResponse: function(data) { 
     return angular.fromJson(data).items; 
     } 
    } 
    }); 
}); 
+0

Questo ha funzionato alla grande! –

+0

Quindi, con questo approccio, come posso accedere alle informazioni di paging dall'esterno del metodo transformResponse? Hai già risposto alla domanda originale, ma ora ho un nuovo problema :) –

+0

Non completamente sicuro, ma potresti provare questo 'var widgets = Widget.query(); widget. $ promise.then (function (data) {console.log (data);}); '. –

2

il facile era utilizzare $resouce.get, se si desidera utilizzare query è possibile ignorare tale comportamento.

$resource('/notes/:id', null, 
{ 
    'query': {method:'GET', isArray:false} 
}); 

maggiori informazioni https://docs.angularjs.org/api/ngResource/service/ $ risorsa

+0

Questo non risolve il mio problema. L'intero oggetto di risposta sarà una '$ risorsa', e il tentativo di chiamare' $ save' o '$ update' tenterà di mantenere i valori che non fanno parte del modello della risorsa effettiva. Devo configurare '$ resource.query()' per sapere che gli oggetti della risorsa reale sono contenuti nella matrice 'items' della risposta. –

+0

Ho fatto questo, e lavora per me, non vedo come non funzionerà, quando chiami l'aggiornamento specifichi l'id e il nuovo oggetto, non vedo come funzionerà 'myresource.update ({id: 1 }. {propery1: 1, property2: 2}) ' –

+0

Questo funzionerà se sto usando' $ resource' rigorosamente come meccanismo per costruire richieste e ottenere un oggetto risposta, tuttavia, ci sono funzionalità aggiuntive di '$ resource' che non sono ampiamente compresi. Nello specifico, gli oggetti restituiti da un endpoint REST diventano essi stessi oggetti '$ risorsa'. Nel mio caso, avevo bisogno di un modo per dire angolare che la proprietà 'list' dell'oggetto restituito sono le risorse effettive. Vedi la risposta accettata. –

0

Ho appena avuto lo stesso problema, e ho voluto proporre una soluzione che potrebbe essere un Poco meglio:

factory('Widget', function($resource) { 
    return $resource(/api/widgets, null, { 
     query: { 
      interceptor: { 
       response: function(response) { 
        return response.data.items; 
       } 
      } 
     } 
    } 
} 

Penso che potrebbe essere migliore, perché stai riusando il comportamento angolare standard iour (che è, in realtà, facendo poco più di fromJson) e intercettando il risultato di output per filtrare quello che vuoi.

0

Io uso questo modello per la query con le informazioni di paging.

module.config(function($resourceProvider){ 
    $resourceProvider.defaults.actions.query = { 
     method: 'GET', 
     interceptor: { 
      response: function(response) { 
       response.resource.$totalCount = response.data.totalCount; 
       response.resource.$limit = response.data.limit; 
       response.resource.$offset = response.data.offset; 
       return response.resource; 
      } 
     }, 
     transformResponse: function(data, headers, status) { 
      var out = angular.fromJson(data); 
      out.data.totalCount = out.totalCount; 
      out.data.limit = out.limit; 
      out.data.offset = out.offset; 
      return out.data; 
     }, 
     isArray: true 
    }; 
})