EmberData设置值可防止模型保存后未来的数据自动加载

Bin*_*les 6 ember.js ember-data

在EmberData调用中model.save(),通过适当的适配器使模型持久化.如果适配器返回一些数据(例如来自API的JSON),则使用该数据更新模型.

我偶然发现了一个不正确的序列.

在用于结账过程的凭证系统中,voucherCodeorder模型上输入a .按下"应用"按钮后,订单将保存,order.save()并且凭证将提交给服务器.

如果凭证代码有效,voucherValue则会使用数字填充字段.如果凭证代码无效,422则会errors根据http://emberjs.com/api/data/classes/DS.Errors.html使用标准对象返回错误

现在,这里出现了问题.如果输入一个代码,返回voucherValue300控制器属性计算折扣.

discount: function () {
  var discount = this.get('model.voucherValue');
  // some calculation
  return discount;
}.property('model.voucherValue')
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因,用户输入无效代码,我们将返回错误,如上所述.服务器删除折扣并设置voucherValue0

由于错误响应不包含在更新数据catch中的save我们手动更新.

order.save().then(function () {

}).catch(function (error) {

  order.set('voucherValue', 0);
});
Run Code Online (Sandbox Code Playgroud)

discount computed property上设置按预期进行更新voucherValue.但是,检查订单模型显示order._data.voucherValue仍然是300第一个有效凭证代码的原始值 - 因为EmberData不知道此值是持久保存在服务器上的.

如果我们再进入返回一个有效的优惠券代码voucherValue300(相同的,因为它本来)discount计算性能不重新计算.

看起来Ember正在检查返回的数据值order._data,因为没有区别不会触发任何属性重新计算.

我尝试了不同的解决方法,但一直无法找到可靠的工作方式.

令人沮丧的是,似乎没有可靠的方法来访问返回的数据并手动设置voucherValue返回的数据.即使返回的数据设置了voucherValue以下值,也是如此:

order.save().then(function (savedOrder) {

  savedOrder.get('voucherValue') === 0; //true

}).catch(function (error) {
  order.set('voucherValue', 0);
});
Run Code Online (Sandbox Code Playgroud)

但是,如果在无效凭证之后输入了不同的凭证且voucherValue不同(例如450)一切都按预期工作.

这是EmberData中的错误吗?知道解决方法吗?在我尝试重新设计整个系统的实现方式之前,我愿意接受建议并愿意尝试任何事情.

Ste*_* H. 0

你的这段代码似乎有问题:

order.save().then(function (savedOrder) {
  savedOrder.get('voucherValue') === 0; //true
}).catch(function (error) {
  order.set('voucherValue', 0);
});
Run Code Online (Sandbox Code Playgroud)

catch函数是 Promise 捕获的代理。然而,promise 通常期望将第二个参数传递给函数then,如下所示:

order.save().then(function (savedOrder) {
  savedOrder.get('voucherValue') === 0; //true
}, function (error) {
  order.set('voucherValue', 0);
});
Run Code Online (Sandbox Code Playgroud)

第二个函数代表所使用的对reject的路径。请参阅: http: //emberjs.com/api/data/classes/DS.Model.html#method_saveresolve/rejectPromise