为什么我不能设置用户ID?

时间:2014-12-08 12:23:02

标签: ember.js ember-data ember-cli

我的一条路线中有这个。

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')
});

我错过了什么吗?

2 个答案:

答案 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');
  });
});

相关: