现有模型上的.save()会导致POST而不是PUT

时间:2011-09-19 15:07:46

标签: backbone.js

我在保存集合中各个模型的更改时遇到了一些问题。已加载的模型(通过集合.reset())发出POST(好像它们是新的)而不是预期的PUT。

这是我正在采取的方法:

APPVIEW

  • 通过this.model.childcollection.reset(JSON DATA FROM SERVER)加载子集合;

  • 在它的渲染功能中,为集合中的每个项目创建一个新的子视图并渲染它:

    render: function() {
            var el = this.el;
            this.model.childcollection.forEach(function(s) {
            var view = new ChildView({ model: s });
            el.append(view.render().el);
        });
        return this;
    },
    

ChildView

  • 在其中一个事件中,它正在更改基础模型的某些值并调用save:

    this.model.set(
            {
                ValueA: somevalue,
                ValueB: somevalue
            },
            {
                error: function() {
                    console.log("Error saving model");
                },
                success: function() {
                    console.log("Model change saved");
                }
            });
        this.model.save();
    

观察:

  • 调用POST(没有子ID)而不是PUT(带子ID)
  • 子元素已设置ID

有人能告诉我为什么会这样吗?

1 个答案:

答案 0 :(得分:29)

backbone使用模型的.id属性(非属性)来确定它是应该放置还是发布,如源代码中所示:https://github.com/documentcloud/backbone/blob/master/backbone.js#L344-346

如果在保存现有模型时正在发帖,则表示未正确加载.id属性。即使对model.get("id")的调用返回了正确的结果,对model.id的调用也必须返回正确的结果,以便知道这不是新模型。

确保您的模型的id属性名为id,如果不是,请务必在模型上设置idAttribute

MyModel = Backbone.Model.extend({
  idAttribute: "myCustomId"
});