无法使用ember-data保存/更新记录

时间:2013-09-25 09:39:59

标签: ember.js ember-data

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

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");
            });
        }
    }
});

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

  

未捕获TypeError:对象[object Object]没有方法'save'

有人可以帮我辨别我做错了吗?

----更新----

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

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

----更新2 ----

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

2 个答案:

答案 0 :(得分:2)

这就是我要做的事情:

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

检查控制台输出是否真的符合您的预期。最有可能的不是您想要保存的模型实例。您将看到在控制台中执行this.get('model').save()时会出现相同的错误。

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

编辑:

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

答案 1 :(得分:1)

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

那就是说,如果你想像我一样(也就是说,在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属性在ObjectControlleritemController中指定。以下是使用此策略的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>