ember.js - EmberData Setting value prevents future autoloads of data after model save -
in emberdata calling model.save()
causes model persisted via whatever adapter in place. if adapter returns data (such json api) model updated data.
i have stumbled upon sequence not true.
in voucher system checkout process vouchercode
entered on order
model. when 'apply' button pressed order saved via order.save()
, voucher submitted server.
if voucher code valid vouchervalue
field populated number. if voucher code invalid 422
error returned standard errors
object per http://emberjs.com/api/data/classes/ds.errors.html
now, here things go awry. if code entered returns vouchervalue
of 300
controller property calculates discount.
discount: function () { var discount = this.get('model.vouchervalue'); // calculation return discount; }.property('model.vouchervalue')
if, whatever reason, user enters invalid code return error described above. server removes discount , sets vouchervalue
0
as error response not contain updated data in catch
of save
manually update it.
order.save().then(function () { }).catch(function (error) { order.set('vouchervalue', 0); });
the discount
computed property
updated expected on setting vouchervalue
. however, inspecting order model shows order._data.vouchervalue
still original 300
value first valid voucher code - emberdata not know value persisted on server.
if enter valid voucher code returns vouchervalue
of 300
(the same originally) the discount
computed property not recalculated.
it appears ember checking returned data values against order._data
, there no difference not triggering property recalculations.
i've tried different workarounds have been unable find works reliably.
frustratingly there not seem reliable way access returned data , manually set vouchervalue
returned data. if returned data sets value vouchervalue
following true:
order.save().then(function (savedorder) { savedorder.get('vouchervalue') === 0; //true }).catch(function (error) { order.set('vouchervalue', 0); });
however, if different voucher entered after invalid voucher , vouchervalue
different (say 450
) works expected.
is bug in emberdata? there know workaround. i'm open suggestions , willing try before try , reengineer how entire system implemented.
this bit of code seems problem:
order.save().then(function (savedorder) { savedorder.get('vouchervalue') === 0; //true }).catch(function (error) { order.set('vouchervalue', 0); });
the catch
function proxy promise's catch. however, promises expect 2nd parameter passed then
function, this:
order.save().then(function (savedorder) { savedorder.get('vouchervalue') === 0; //true }, function (error) { order.set('vouchervalue', 0); });
this 2nd function represents reject
path of resolve/reject
pair used promise
. see: http://emberjs.com/api/data/classes/ds.model.html#method_save
Comments
Post a Comment