2011-09-19 50 views
12

我在保存对集合中各个模型的更改时遇到了一些麻烦。已经加载的模型(通过集合.reset())将发布POST(就像它们是新的),而不是预期的PUT。.save()在现有模型上导致POST而不是PUT

下面是我采用的方法:

APPVIEW

  • 负载通过this.model.childcollection.reset子集(JSON数据从服务器);

  • 在它的渲染功能,集合中的每个项目创建一个新的childview并对其进行渲染:

    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

  • 在它的事件之一,它正在改变底层模式的一些价值并呼吁保存:

    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)
  • 子元素都标识设置

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

回答

29

骨干所用的模型的.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" 
}); 
+0

感谢 - 这似乎一直是问题 - “标识'服务器端模型的属性名称被大写。将它改为小写似乎已经修复了它。 – UpTheCreek

+1

或者,在扩展Backbone.Model时,您可以通过使用'idAttribute'选项更改Backbone认为ID字段的字段名称。 –

相关问题