【问题标题】:can't save/update record using ember-data无法使用 ember-data 保存/更新记录
【发布时间】:2013-09-25 09:39:59
【问题描述】:

我的路由器定义了以下内容:

this.resource('uoms', { path: '/uoms' }, function() {
    this.route('new');
});

uoms路由定义为:

App.UomsRoute = Ember.Route.extend({
    model: function() {
        return this.store.find('uom');
    },

    actions: {
        save: function() {
            this.modelFor('uoms').save().then(function() {
                console.log("saved UOMs");
            });
        }
    }
});

但由于某种原因,当我尝试保存它时,我得到了:

Uncaught TypeError: Object [object Object] has no method 'save'

谁能帮我找出我做错了什么?

---- 更新----

我还从控制器尝试了以下操作,但结果相同:

App.UomsController = Ember.ArrayController.extend({
    actions: {
        save: function() {
            this.get('model').save().then(function() {
                console.log("saved UOMs");
            });
        }
    }
});

---- 更新 2 ----

查看this.get('model') 调用返回的对象,我们得到以下信息:

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    这就是我会做的:

    • 使用 Chrome 开发者工具在您尝试保存模型的行设置断点
    • 要检查控制器持有的模型,请在 Chrome 开发者工具控制台中输入 this.get('model')

    检查控制台输出是否真的如您所愿。很可能它不是您要保存的模型实例。你会看到在控制台中执行this.get('model').save()会得到同样的错误。

    顺便说一句:您为什么使用ArrayController 而不是ObjectController。看起来您将它用于单个模型。有关详细信息,请参阅docs

    编辑:

    试试this.get('model').get('transaction').commit()

    【讨论】:

    • Uoms 确实是模型Uom 的一个ArrayController。为什么你认为不是?
    • 我会尝试你建议的调试策略,看看我得到了什么。谢谢。
    • 对我来说,您的场景看起来如何并不清楚:您是否在模板中显示多个项目?您是否在该模板中包含表单?表单是否允许编辑 UOM 的单个实例甚至多个项目?究竟是什么触发了“保存”操作?
    • 我有一个 UOM 列表,用户可以单击其中一个进行编辑。一旦他们编辑了一条记录,我想使用save() 将该更改保留回后端。我已经用this.get('model') 调用的结果更新了原始问题。它看起来像是一个合理的对象,但正如您从新屏幕截图中看到的那样,错误保持一致。
    • 我刚刚注意到我从未在我的代码中使用save()。但是get('transaction').commit() 应该可以解决问题。我相应地编辑了我的答案。
    【解决方案2】:

    我遇到的问题是我试图在一组记录而不是单个记录上调用save()。这个问题是因为我在一个单一的记录上操作但在ArrayController 中执行此操作而产生的。我不认为这有什么问题,尽管可以说我应该创建一个名为“edit”的子路由,然后大概我的代码逻辑会起作用。

    也就是说,如果你想像我一样做(也就是在 ArrayController 中保存一条单数记录),那么这段代码就可以工作:

    save: function(id) {
        var promise = this.store.find('uom',id).then(function(uom){
            console.log(uom);
            uom.save();
        });
    }
    

    然后在模板中加入如下内容:

    <span class="glyphicon glyphicon-floppy-disk" {{action "save" id}}></span>
    

    这可行,但不是最佳答案。相反,您可以在 ArrayController 中使用 itemController 属性指定 ObjectController。下面是使用此策略的 save()deleteRecord() 处理程序的示例:

    App.PluralController = Ember.ArrayController.extend({
        itemController: 'singular'
    });
    
    App.SingularController = Ember.ObjectController.extend({
        actions: {
            save: function() {
                this.get('model').save();
            },
            deleteRecord: function() {
                this.get('model').deleteRecord();
                this.get('model').save();
            }
        }
    });
    

    然后您需要为您的车把模板执行以下操作:

    <span class="glyphicon glyphicon-floppy-disk" {{action "save" this}}></span>
    <span class="glyphicon glyphicon-remove-circle" {{action "deleteRecord" this}}></span>
    

    【讨论】:

    • 使用.destroyRecord()会同时删除记录并保存。 Ember docs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多