如何多次更新Ember Data对象?

时间:2013-02-10 22:43:08

标签: transactions ember.js ember-data

我有简单的应用程序使用Band实体。我创建了用户可以更新现有记录的表单。它由这个控制器处理:

App.BandEditController = Ember.Controller.extend({

    startEditing: function() {
        var band = this.get('model');
        var transaction = band.get('store').transaction();
        transaction.add(band); <-- THIS IS THE PROBLEM (IN 2ND RUN)
        this.transaction = transaction;
    },

    stopEditing: function() {
        // rollback the local transaction if it hasn't already been cleared
        var transaction = this.transaction;
        if (transaction) {
            transaction.rollback();
            this.transaction = undefined;
        }
        this.startEditing();
    },

    save: function() {
        this.transaction.commit();
        this.transaction = undefined;
        this.stopEditing();
    },

    cancel: function() {
        this.stopEditing();
    }
});

这得到了很大的启发:https://github.com/dgeb/ember_data_example/blob/master/app/assets/javascripts/controllers/contact_edit_controller.js

当我显示表单并执行一次编辑时,一切正常。但是,我想保持表单显示,并允许用户再次编辑它。使用我的方法,在将更新的记录发送到服务器后立即,当startEditing方法尝试再次将带添加到事务时,我收到此错误:

Uncaught Error: assertion failed: Once a record has changed, you cannot move it into a different transaction 

我知道我不能用同一个对象创建另一个事务。但为什么?我该如何解决这个问题?

(顺便说一句,有没有比那些事务,startEditing和stopEditing方法更新记录更简单的方法?对我来说似乎有点矫枉过正。)

1 个答案:

答案 0 :(得分:0)

您从this.startEditing();致电stopEditing - 这似乎很奇怪。原始代码中没有这样的行。如果你从其他地方打电话给startEditing,这将导致它被调用两次..

此外,AFAIK,您需要等待服务器响应才能再次更改模型..