首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用hasMany关系对模型进行回滚

使用hasMany关系对模型进行回滚
EN

Stack Overflow用户
提问于 2014-01-11 04:15:28
回答 1查看 1.1K关注 0票数 18

我的模型定义如下:

代码语言:javascript
复制
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

谢谢你,小迪

更新:

由于我无法以预期的方式执行回滚,因此我执行了以下步骤:

代码语言:javascript
复制
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/

在这里,你可以创建新的答案,然后将其附加到问题中,并进行回滚。但是,如果您遵循以下步骤,您将看到我面临的问题:

代码语言:javascript
复制
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:

一个简单的解决办法是隐藏删除时的答案。我修改了一下模型,如下所示:

代码语言:javascript
复制
App.Answer = DS.Model.extend({
    name: DS.attr('string'),
    layoutName: DS.attr('string'),
    markToDelete: DS.attr('boolean', {default: false})
});

我的回滚函数有这样的逻辑:

代码语言:javascript
复制
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();
    }
});
EN

回答 1

Stack Overflow用户

发布于 2014-01-12 03:47:10

我不确定你的范围,但对于这种关系(我实际上在这里回滚belongsTo,但我很好奇这是否有任何帮助)

代码语言:javascript
复制
   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客户模型(从我的路径中)

代码语言:javascript
复制
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;
    }
}
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21053613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档