In EmberData la chiamata model.save()
causa la permanenza del modello tramite qualsiasi adattatore inserito. Se l'adattatore restituisce alcuni dati (come JSON da un'API), il modello viene aggiornato con tali dati.EmberData Il valore dell'impostazione impedisce futuri caricamenti automatici di dati dopo il salvataggio del modello
Mi sono imbattuto in una sequenza in cui questo non è vero.
In un sistema di voucher per un processo di checkout è inserito un voucherCode
su un modello order
. Quando viene premuto il pulsante "Applica", l'ordine viene salvato tramite order.save()
e il buono viene quindi inviato al server.
Se il codice del buono è valido, il campo voucherValue
viene popolato con un numero. Se il codice voucher non è valido, viene restituito un errore 422
con un oggetto standard errors
come da http://emberjs.com/api/data/classes/DS.Errors.html
Ora, qui è dove le cose vanno male. Se viene inserito un codice che restituisce un voucherValue
di 300
, una proprietà del controllore calcola lo sconto.
discount: function() {
var discount = this.get('model.voucherValue');
// some calculation
return discount;
}.property('model.voucherValue')
Se, per qualsiasi motivo, l'utente poi entra un codice non valido torniamo un errore come descritto sopra. Il server rimuove lo sconto e imposta il voucherValue
-0
Come la risposta di errore non contiene i dati aggiornati nel catch
del save
aggiorniamo manualmente.
order.save().then(function() {
}).catch(function (error) {
order.set('voucherValue', 0);
});
Il discount
computed property
viene aggiornato come previsto sull'impostazione del voucherValue
. Tuttavia, l'ispezione del modello di ordine mostra che è ancora il valore originale del 300
dal primo codice voucher valido - poiché EmberData non sa che questo valore è persistente sul server.
Se poi entriamo un codice voucher valido che restituisce un voucherValue
di 300
(lo stesso come era in origine) la discount
proprietà calcolata non viene ricalcolato.
Sembra che Ember stia verificando i valori dei dati restituiti rispetto a order._data
e poiché non vi è alcuna differenza non causa alcun ricalcolo di proprietà.
Ho provato soluzioni alternative diverse ma non sono riuscito a trovare qualcosa che funzioni in modo affidabile.
Frustrantemente non sembra essere un modo affidabile per accedere ai dati restituiti e impostare manualmente il valore voucherValue
dai dati restituiti. Anche se i dati restituiti imposta un valore per voucherValue
seguenti condizioni:
order.save().then(function (savedOrder) {
savedOrder.get('voucherValue') === 0; //true
}).catch(function (error) {
order.set('voucherValue', 0);
});
Tuttavia, se un buono diverso viene inserita dopo un buono valido e il voucherValue
è diverso (diciamo 450
) tutto funziona come previsto.
Si tratta di un bug in EmberData? C'è un modo per ovviare al problema. Sono aperto a suggerimenti e pronto a provare qualsiasi cosa prima di provare e riprogettare come viene implementato l'intero sistema.
Si prega di modificare la formulazione del titolo/domanda se è possibile, so che cosa ho messo è abbastanza orribile. – Binarytales
Non ne sono del tutto sicuro, ma penso che una volta ho avuto questo problema ... Ho dovuto cambiare il codice di risposta http a 204 No Content Immagino ... – enspandi
Non riesco a replicare il tuo scenario .. Tu dici che dopo aver provato a salvare un VoucherValue di 300, ottenendo un errore dal server e impostando voucherValue su 0 (nel tuo catch), se lo imposti a 300 ancora la proprietà calcolata non ricalcola .. per me lo fa .. – jmurphyau