2013-08-08 27 views
6

Diciamo che ho una risorsa con diversi campi, e alcuni di loro sono di sola lettura. O forse appartengono a diversi casi d'uso che vorrei gestire diversamente sul server.Come mettere solo alcuni campi con Restangular?

Per esempio, la mia risorsa bing assomiglia a questo:

{id: 1, 
foo: "A", 
bar: "B", 
createdAt: "2013-05-05"} 

vorrei ottenere Restangular a PUT solo alcuni campi, l'esecuzione di domande come:

PUT /bing/1 {foo: "A"} 
PUT /bing/1 {bar: "B"} 
PUT /bing/1 {foo: "A", bar: "B"} 

Quello che non vuole fare è:

PUT /bing/1 {id: 1, foo: "A", bar: "B", createdAt: "2013-05-05"} 

Come posso ottenerlo?

risposta

6

Questo è un PATCH non uno PUT.

Vedi https://tools.ietf.org/html/rfc5789

+0

Interessante. Come posso ottenere ciò di cui ho bisogno con Restangular, anche con PATCH? –

+0

Non ho mai sentito parlare di Restangular prima, quindi non posso aiutarti. Forse scrivi la tua routine se il framework non lo supporta? Forse puoi estendere il framework per supportare 'PATCH'? –

+1

Bene, questa è una domanda specifica su Restangular. Imparare la differenza tra 'PATCH' e' PUT' è utile e grazie per questo, ma sto ancora cercando una risposta Restangular. –

22

Sono il creatore di Restangular.

@Nicholas ha assolutamente ragione :). Questo è un PATCH e non un PUT. E Restangular lo supporta :).

elem.patch({foo: 2}) sarebbe la strada da percorrere se elem è già un oggetto restangularized.

Spero che questo aiuti !!

2

Un modo per eseguire questa operazione è passare l'intero oggetto al metodo patch, inclusi tutti i campi che non si desidera inviare al back-end, quindi utilizzare un intercettore di richiesta per eliminare eventuali campi indesiderati prima della richiesta è inviato.

Ad esempio, per eliminare sempre il campo createdAt da qualsiasi richiesta di patch si potrebbe fare qualcosa di simile

app.config(function(RestangularProvider) { 
    RestangularProvider.setRequestInterceptor(function(element, operation, route, url) { 
    if (operation === 'patch') { 
     delete element.createdAt; 
     return element; 
    } 
    }); 
}); 

Per ulteriori informazioni su richiesta intercettori vedere la documentazione sul setRequestInterceptor

+2

Trovo che questo metodo sia a volte più pulito, mi consente di inserire semplicemente oggetti JS in altri oggetti JS e di inviarli con Restangular, senza intaccare tutto il codice con preoccupazioni su quali particolari campi dovrebbero andare sulla rete. –

Problemi correlati