繁体   English   中英

灰烬数据交易错误

[英]Ember-Data transaction error

我在Ember-Data交易中遇到问题。

我有一个像这样的DS.Model

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

然后像这样在路由中稍后启动

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,该ID将在服务器端使用,并随搜索结果一起发送回去,然后添加到“答案”中。

正常工作,直到找到多个结果。 然后创建一个新模型,并在具有不同内容的其他控制器上再次调用搜索功能。 这次是在记录行。

我得到的错误未被捕获的错误:试图处理事件loadedData上,而在状态rootState.loaded.updated.uncommitted。 用未定义调用

因此,服务器仍然以正确的结果进行响应,但是客户端不会更新“答案”。

您的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();
    }
});

第一次提交后,该事务将放在默认事务上。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM