Bin*_*les 6 ember.js ember-data
在EmberData调用中model.save(),通过适当的适配器使模型持久化.如果适配器返回一些数据(例如来自API的JSON),则使用该数据更新模型.
我偶然发现了一个不正确的序列.
在用于结账过程的凭证系统中,voucherCode在order模型上输入a .按下"应用"按钮后,订单将保存,order.save()并且凭证将提交给服务器.
如果凭证代码有效,voucherValue则会使用数字填充字段.如果凭证代码无效,422则会errors根据http://emberjs.com/api/data/classes/DS.Errors.html使用标准对象返回错误
现在,这里出现了问题.如果输入一个代码,返回voucherValue的300控制器属性计算折扣.
discount: function () {
var discount = this.get('model.voucherValue');
// some calculation
return discount;
}.property('model.voucherValue')
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因,用户输入无效代码,我们将返回错误,如上所述.服务器删除折扣并设置voucherValue为0
由于错误响应不包含在更新数据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不知道此值是持久保存在服务器上的.
如果我们再进入返回一个有效的优惠券代码voucherValue的300(相同的,因为它本来)的 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中的错误吗?知道解决方法吗?在我尝试重新设计整个系统的实现方式之前,我愿意接受建议并愿意尝试任何事情.
你的这段代码似乎有问题:
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
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |