当我在Ember-Data中更改hasMany/belongsTo关系时,如何使父文件变脏?

mig*_*ain 14 relationship ember.js ember-data

现在,我对Ember Data的主要问题是,当我改变一个关系(hasMany或belongsTo)时,父亲不会变脏.

我需要这个因为:

  • 我依赖于isDirty属性来显示保存/取消按钮
  • hasMany和belongsTo ids与父级一起发送,因此父级实际上脏的.

此外,当我回滚父级时,仅还原belongsTo关系.hasMany型号保持不变.

我发现这个问题涉及一个dirtyRecordsForHasManyChange钩子,但这似乎不存在于Ember Data v1(v1.0.0-beta.3,这就是我正在使用的)中.

我怎么能做到这一点?

谢谢.

小智 11

对于belongsTo,我添加了一个观察者.

例如,我在拥有belongsTo省的人.在我的表格上,我有一个省份的余烬选择.在Person模型中我添加了这个观察者......

provinceChanged: function() {
  this.send('becomeDirty');
}.observes('province')
Run Code Online (Sandbox Code Playgroud)

我也依赖于isDirty显示/隐藏保存/取消按钮,虽然该观察者在将记录标记为脏时做得很好,但如果我点击取消,我会进行回滚,但我还需要将记录标记为干净.我在取消操作的Person控制器中执行此操作.

cancel: function() {
  this.get('model').rollback();
  this.set('isEditing', false);
  this.get('model').adapterWillCommit();
  this.get('model').adapterDidCommit();
}
Run Code Online (Sandbox Code Playgroud)

这一切似乎都很有效.

对于另一个项目的hasMany,我们在控制器上使用了计算属性.

isThisOrChildrenDirty: function() {
  return this.get('isDirty') || this.get('authors').get('isDirty');
}.property('isDirty','authors.@each.isDirty')
Run Code Online (Sandbox Code Playgroud)

然后检查isThisOrChildrenDirty而不是检查isDirty.

希望这很有帮助.


小智 4

this.get('model').send('becomeDirty');
Run Code Online (Sandbox Code Playgroud)

这应该可以做到这一点。只需将becomeDirty发送到父模型即可。