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

UpT*_*eek 12 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;
    },
    
    Run Code Online (Sandbox Code Playgroud)

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();
    
    Run Code Online (Sandbox Code Playgroud)

观察:

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

谁能告诉我为什么会这样?

Der*_*ley 29

backbone使用模型的.id属性(非属性)来确定它是应该put还是post,如源代码所示: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"
});
Run Code Online (Sandbox Code Playgroud)