【发布时间】:2013-02-04 10:45:07
【问题描述】:
我有两个有亲子关系的模型:训练和锻炼:
App.Training = DS.Model.extend({
exercises: DS.hasMany('App.Exercise')
})
App.Exercise = DS.Model.extend({
training: DS.belongsTo('App.Training')
})
我想要一个页面,其中显示包含所有相关练习的培训。如果用户按下Edit 按钮,页面将变为可编辑,并可以添加新练习。我还想要一个Cancel 按钮,它会丢弃所做的所有更改。
这是我的控制器:
App.TrainingsShowController = Em.ObjectController.extend({
editing: false,
edit: function() {
this.set('editing', true);
transaction = this.get('store').transaction();
transaction.add(this.get('model'));
this.get('model.exercises').forEach(function(x){
transaction.add(x);
});
},
cancel: function() {
this.set('editing', false);
this.get('model.transaction').rollback();
},
save: function() {
this.set('editing', false);
this.get('model.transaction').commit();
},
addExercise: function() {
this.get('model.exercises').createRecord({});
}
})
控制器中有四个事件处理程序:
-
edit:用户按下了Edit按钮:一个事务被创建,页面进入“编辑”模式。 -
cancel:用户按下了Cancel按钮:事务回滚并返回“正常”模式。 -
save:用户按下了Save按钮:事务已提交并返回“正常”模式。 -
addExercise:用户按下了Add exercise按钮:创建了一个新练习(在同一事务中)并添加到训练中。
除了新创建的记录外,回滚功能工作正常:如果我按下Edit 按钮,添加一个新练习并按下Cancel 按钮,新创建的练习将保留在页面上。
摆脱丢弃的子记录的最佳方法是什么?
更新:
我创建了一个 jsFiddle 来重现问题,但它确实有效。与我在这里的应用程序不同,我使用了DS.FixtureAdapter:http://jsfiddle.net/tothda/LaXLG/13/
然后我使用DS.RESTAdapter 创建了另一个,问题出现了:http://jsfiddle.net/tothda/qwZc4/5/
在小提琴中尝试:编辑,添加新然后回滚。
我想通了,在 RESTAdapter 的情况下,当我将新的子记录添加到 hasMany 关系时,父记录不会变脏。看起来不错,但是当我回滚事务时,新创建的子记录保留在父的 ManyArray 中。
我仍然不知道,处理这种情况的最佳方法是什么。
【问题讨论】:
标签: ember.js ember-data relationships