【问题标题】:Reload from save() response with Ember-Data使用 Ember-Data 从 save() 响应重新加载
【发布时间】:2014-04-03 03:43:46
【问题描述】:

我目前正在使用 EmberJs 和 Ember-Data 来构建一个由 Laravel JSON api 支持的应用程序。

我在保存过程中遇到了一点问题,主要是在模型创建方面。

这是我的工作流程:

  1. Ember 对象控制器自救this.get("model").save()
  2. Laravel (REST api) 接收数据并将其持久化,因此 为其创建唯一 ID
  3. api 返回新数据(即 尊重 Ember 约定)使用正确的 ID
  4. ???? Ember-Data 没有 似乎关心响应,因为它什么都不做......

这里的问题:id 即使已经给出,它仍然未定义......

我发现的解决方法是重新加载模型...但考虑到我想要重新加载的数据在 save() 之后直接可供 Ember 使用,这是一个很大的性能缺陷

有什么想法吗?

编辑 **

问题只发生在我添加的第一个对象上。当我重复该过程时,下一个对象会正确刷新。如果我点击刷新,它会重新开始:第一个对象错过了他的刷新,以下是可以的。

这是我关于添加过程的代码:

路线

App.CategoriesNewRoute = Ember.Route.extend({
    model: function()
    {
        return this.store.createRecord("category").set("active", true);
    },
    setupController: function(ctrl, model)
    {
        ctrl.set("errors", 0);
        ctrl.set("model", model);
    }
});

我没有CategoriesRoute 的任何路由器,因为数据从一开始就在我的 ArrayController 中。

控制器

App.CategoriesNewController = Ember.ObjectController.extend({
    needs: "application",
    actions:
    {
        save: function()
        {
            this.get("model").save();
            this.get("target").transitionTo("categories");    
        },
        cancel: function()
        {
            this.get("model").rollback();
            this.get("target").transitionTo("categories");
        }
    }
});

编辑 ** 2 我尝试了下面提供的代码,但没有成功...

我添加了 2 条记录,第一个没有它的 ID...第二个得到它,所以问题似乎只在第一次保存...

这是我从 API 获得的 2 个响应

对象A

{"category":{"nameFr":"aaa","nameEn":"aaa","active":true,"id":10}}

对象B

{"category":{"nameFr":"bbb","nameEn":"bbb","active":true,"id":11}}

【问题讨论】:

  • 嗯,我没有注意到这种行为。您使用的是 Ember Data 的最新测试版吗?如果是这样,保存模型后 id 是不在模型上还是不在控制器上(或不在任何一个上)?您能否发布一些代码或 JSBin 来说明您在做什么?
  • 我添加了一些关于我发现的东西的细节
  • 返回到 Ember 的 JSON 对象是什么样的?
  • 在下面回答,但可能会有更多事情发生。您可以添加您的 CategoriesRoute 代码吗?
  • JSON 看起来不错。也许包括一个 JSBin,其中包含您的所有路由器代码,以及您访问 id 的代码?

标签: ember.js ember-data


【解决方案1】:

这可能是因为您在保存完成之前进行了转换,因此类别路由上的模型挂钩在您保存的模型仍在运行时触发(您是否在控制台中遇到任何错误?)。尝试将保存操作更改为

    save: function()
    {
        var that = this;
        this.get("model").save().then(function(){
            that.get("target").transitionTo("categories");
        });
    },

另外,您不需要this.get('target')...,因为有一个控制器方法transitionToRoute。您可以简化为:

    save: function()
    {
        var that = this;
        this.get("model").save().then(function(){
            that.transitionToRoute("categories");
        });
    },

【讨论】:

  • 没用 :( 不,我在控制台没有收到任何错误。感谢更好的过渡语法
【解决方案2】:

发现问题似乎出在 Ember-Data 这边...

在这里记录了整个事情:

http://discuss.emberjs.com/t/missing-id-on-first-save-on-a-new-object/4752

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2013-05-09
    • 1970-01-01
    相关资源
    最近更新 更多