0

我遇到了 Ember-Data 事务的问题。

我有一个这样的 DS.Model

App.MyModel = DS.Model.extend({
    id: DS.attr(),
    answers: DS.hasMany('App.Answer') // another model 
});

然后它稍后会像这样在a Route中启动

model: function(){
     var transaction = this.get('store').transaction();

     return transaction.createRecord(App.MyModel, {
         id: '1'
     });
}

我有一个模型,它使用事务和提交向我的后端服务器发出请求。

this.get('content.transaction').commit();

目的是在服务器端更新答案并将其发送回给我。如果内容还没有更新,我称之为

this.get('content').reload();

然后再次发送请求。

这一切都很好。如果找到 id,就会填充答案。

我的问题是,有时,根据我从服务器返回的内容,我必须发出另一个服务器请求。初始请求适用于

this.get('content.transaction').commit();

但是当我尝试重新加载事务时,我得到一个错误,如下

Uncaught Error: Attempted to handle event `loadedData` on <App.Answer> while in state rootState.loaded.updated.uncommitted. Called with undefined

现在,当我删除重新加载时,我不再收到错误,当我在网络选项卡下检查 Chrome 的控制台时,我可以看到我想要的结果正在被发回,但它们没有在我的 DS 模型中更新。答案未定义。

有谁知道为什么会这样?我是否使用了错误的交易?

编辑

Application.SearchController = Ember.ObjectController.extend({
    isComplete: function () {
        return this.get('content.answers.length') !== 0;
    },


    search: function () {
        this.get('content.transaction').commit();

        var record = this.get('content');

        var interval = setInterval(function (controller) {
            if (controller.get('isComplete')) {
                controller.transitionToRoute("search.view");
                clearInterval(interval);
            } else {
                record.reload();
            }
        }, 5000, this);
    }
 });

所以基本上在我的路线中完成了一些工作来设置我的模型并将它们设置为内容,模型有一个 id 将在服务器端使用并与搜索结果一起发回然后添加到“答案”。

在找到多个结果之前,这项工作正常。然后创建一个新模型,并在具有不同内容的不同控制器上再次调用搜索函数。这次轮到就行 record.reload();

我收到错误 Uncaught Error: Attempted to handle event loadedDataon while in state rootState.loaded.updated.uncommitted。未定义调用

所以服务器仍然以正确的结果响应,但客户端没有更新“答案”。

4

2 回答 2

0

您的MyModel记录在本地修改(客户端)。调用reload会尝试更新它,这在当前记录状态下是被禁止的。

您可以使用以下命令进行检查:

console.log( this.get('content.stateManager.currentState.path') );
this.get('content').reload();

这应该在您的控制台中显示该记录处于该uncommitted状态。

更新:

你不能使用计时器。一切都是异步的,您无法保证您的模型会在该时间间隔内更新。这意味着当您提交记录时,您可能会同时重新加载它(这会产生您看到的错误)。

你想要的是这样的:

Application.SearchController = Ember.ObjectController.extend({
    search: function () {
        var record = this.get('content'),
            controller = this;

        record.one('didCommit', function() {
            controller.transitionToRoute("search.view"); 
        });

        record.transaction.commit();
    }
});
于 2013-04-30T15:52:43.600 回答
0

第一次提交后,事务被放置在默认事务上。

错误尝试处理事件`loadedData`:deleteRecord 后对象未更新

请记住始终先设置路由器。

于 2013-05-01T20:18:02.070 回答