3

hasMany 关系之一不是 POST 回服务器。你应该如何建模双向关系?

以下是相关对象:

Encompass.Selection = DS.Model.extend({
  text: DS.attr('string'),
  submission: DS.belongsTo('submission', {inverse: 'selections'}),
});

Encompass.Submission = DS.Model.extend({
  shortAnswer: DS.attr('string'),
  selections: DS.hasMany('selection'),
  testing: DS.hasMany('folder'),
  workspaces: DS.hasMany('workspace'),
});

和一个控制器动作:

testing2: function() {
  var submission = this.get('model');
  console.log(submission.get('selections.length'));
  var newSelection = this.get('store').createRecord('selection', {
    text: 'testing2 selection' + new Date().getMilliseconds(),
    submission: submission,
    coordinates: 'bogus coords',
    workspace: this.get('currentWorkspace')
  });
  //newSelection.save();
  console.log(submission.get('selections.length'));
  submission.save();
},

当我点击 testing2 操作时,控制台显示提交首先有 1 个选择,然后是第二个。该save()方法触发了一个帖子,但它缺少 selections 对象:

  {
    submission: {
      shortAnswer: "short", 
      testing:     [],
      workspaces:  ["5271d0147205f15e31000001"]
    }
  }

我试过删除和添加逆映射。奇怪的部分是其他有很多关系工作。

我发现唯一有效的方法是submissionSelection.

4

2 回答 2

0

这是 hasMany 未发回的情况之一。

我们有时会看到从 save() 操作序列化的 json 不包含我们刚刚设置的数据,这真是令人费解。

selection.set('workspace', workspace)
selection.save()

json 可能如下所示:

{ 
 id: 02314892038,
 workspace: undefined,
 isTrashed: false
}

工作区正在设置中,但不是现在。有一个设置它的承诺,如果后端需要它,我们应该等待它。

selection.set('workspace', workspace);
selection.get('workspace').then(function(){
  selection.save();
});

所以本质上你可能会看到不确定的行为:

  • 适用于这种方法/为什么不在这里
  • 为我工作
  • 曾经工作

这不仅适用于一组后的保存。我见过一些情况,数据是从早些时候加载的,但由于某种原因关系不完整。

我不确定为什么这不能为未实现的关系序列化 ID(我们总是知道 ID,这就是 JSON 所需要的全部)。

于 2014-05-29T16:22:13.523 回答
0

我有同样的问题。我尝试删除 DS.belongTo 语句但没有任何效果。我使用模型的“保存”功能来触发向服务器发送消息。我想知道是否有另一种触发方式可能会导致将不同的消息(带有 hasMany 记录)发送到服务器。

于 2013-11-09T02:36:42.910 回答