我的一条路线中有这个。
var order = _this.store.createRecord('order');
order.set('product', product);
this.store.find('userProfile', 1).then(function(user) {
console.log(user.get('id'));
order.set('user', user);
});
order.save().then(function() {
_this.transitionTo('products.index');
});
我收到此错误:
Error: Assertion Failed: Error: The backend rejected the commit because it was invalid: {userId: can't be blank}
API有效负载如下:
{"order":{"user_id":null,"product_id":"30"}}
这很奇怪,因为console.log(user.get('id'));
获取了用户的ID,这表明user
应该是正确的对象。
我似乎没有设置用户ID。这意味着order.set('user', user);
没有执行correclty ...
我的Order
模型如下:
import DS from 'ember-data';
export default DS.Model.extend({
user: DS.belongsTo('userProfile'),
product: DS.belongsTo('product')
});
我错过了什么吗?
答案 0 :(得分:1)
对this.store.find
的调用是异步的,并返回一个promise。此代码在order.save()
之后立即调用find
,因此承诺尚未解决,用户记录仍为null
。这就是有效载荷中没有user_id
的原因。
console.log
位于then
处理程序中,一旦履行了承诺就会执行,因此您可以访问用户的属性。确保需要user
对象的任何代码都在then
处理程序中发生。
this.store.find('userProfile', 1).then(function(user) {
order.set('user', user);
order.save();
});
答案 1 :(得分:1)
这是因为代码没有按照您在屏幕上看到的顺序执行。 this.store.find()
表示:启动后台线程,该线程应在搜索结果进入时开始。
所以基本上,你开始并行发生一些事情,你不知道find()
或save()
是先执行的。我建议在console.log()
中添加save()
,以便您可以看到它实际上在find()
中的代码之前运行(至少有时)。
解决方案是移动save()
回调内的find()
:
this.store.find('userProfile', 1).then(function(user) {
console.log(user.get('id'));
order.set('user', user);
order.save().then(function() {
_this.transitionTo('products.index');
});
});
相关: