使用Ember-Data从save()响应重新加载

时间:2014-04-03 03:43:46

标签: ember.js ember-data

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

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

这是我的工作流程:

  1. Ember ObjectController自行保存this.get("model").save()
  2. Laravel(REST api)接收数据并保留它 为它创建一个唯一的ID
  3. api返回新数据(即 尊重Ember惯例)并使用正确的ID
  4. ???? Ember-Data没有 似乎关心反应,因为它什么也没做......
  5. 问题在于: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}}
    

2 个答案:

答案 0 :(得分: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");
        });
    },

答案 1 :(得分:0)

发现问题似乎出现在Ember-Data的一面......

在这里记录了整个事情:

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