我的模型定义如下:
App.Answer = DS.Model.extend({
name: DS.attr('string'),
layoutName: DS.attr('string')
});
App.Question = DS.Model.extend({
name: DS.attr('string'),
answers: DS.hasMany('answer', {async: true})
});
我有一个组件,允许删除和添加答案的问题模型。该组件带有apply和cancel按钮,当用户单击cancel时,我希望恢复所有更改(添加/删除答案)。目前回滚不能做到这一点,我在使用rest适配器时尝试了model.reload(),这对我也不起作用。你知道在这种情况下我该怎么做回滚吗?
在使用rest适配器时,我很可能会遇到这里指出的问题:EmberJS cancel (rollback) object with HasMany
谢谢你,小迪
更新:
由于我无法以预期的方式执行回滚,因此我执行了以下步骤:
1) get all the answers back from the server
2) remove answer association from the question
3) manually add answer association to the question model from data received from server
这似乎工作得很好,但遗憾的是,我得到了一个我无法摆脱的错误。
这是一个更新进度的jsbin:http://jsbin.com/uWUmUgE/2/
在这里,你可以创建新的答案,然后将其附加到问题中,并进行回滚。但是,如果您遵循以下步骤,您将看到我面临的问题:
1) delete an answer
2) add an answer
3) perform rollback
4) add an answer
它抛出此错误:Error: Attempted to handle event didSetProperty
root.deleted.uncommitted on while in state root.deleted.uncommitted。使用{name: position,oldValue: 1,originalValue: 1,value: 2}调用。
我将非常感谢你能提供的任何帮助。
WORK-AROUND:
一个简单的解决办法是隐藏删除时的答案。我修改了一下模型,如下所示:
App.Answer = DS.Model.extend({
name: DS.attr('string'),
layoutName: DS.attr('string'),
markToDelete: DS.attr('boolean', {default: false})
});
我的回滚函数有这样的逻辑:
answers.forEach(function (answer) {
if(!answer.get('id')){
//newly created answer models that has not persisted in DB
question.get('answers').removeObject(answer);
answer.deleteRecord();
} else {
answer.rollback();
}
});
发布于 2014-01-12 03:47:10
我不确定你的范围,但对于这种关系(我实际上在这里回滚belongsTo,但我很好奇这是否有任何帮助)
App.Appointment = DS.Model.extend({
name: DS.attr('string'),
customer: DS.belongsTo('customer', {async: true})
});
App.Customer = DS.Model.extend({
name: DS.attr('string'),
appointments: DS.hasMany('appointment', {async: true})
});
我可以像这样回滚约会和它的hasMany客户模型(从我的路径中)
App.AppointmentRoute = Ember.Route.extend({
actions: {
willTransition: function(transition) {
var context = this.get('context');
var dirty =context.get('isDirty');
var dirtyCustomer=context.get('customer.isDirty');
var message = "foo";
if ((dirty || dirtyCustomer) && confirm(message)) {
transition.abort();
}else{
context.get('customer').get('content').rollback();
context.rollback();return true;
}
}
});
https://stackoverflow.com/questions/21053613
复制相似问题