为什么Backbone的集合create()方法没有填充id?

时间:2014-04-16 02:27:08

标签: javascript backbone.js backbone-collections backbone-model backbone.js-collections

在我的视图下面的方法中,如果我正确理解create()方法,我的模型将与服务器同步。但是,console.log的{​​{1}}仍会返回this.model.idundefined会返回this.model.isNew()。 POST在返回的JSON对象中显示一个id,模型对象属性也显示一个id,那么为什么它们在模型中没有正确反映?我需要在创建新视图时设置id。

true

2 个答案:

答案 0 :(得分:4)

所以Jacob,这里的问题只是在渲染你的视图之前,你需要等待来自服务器的响应。您的this.model.id将为undefined,因为您的模型是新的,这意味着它尚未保存在服务器中。

因此,您可以做的是使用success函数中的.create回调。我相信这样的事情对你有用。

if (this.model.isNew()) {
  collection.create({
    // or you can use this.model (if it is an object)
    attribute_x: 'val',
    attribute_y: 'val'
  }, success: function(response){
    // here your model with have an id
    console.log(response);
    new MyView({
      model: response.model // check your response
    }).render().appendNode();             
  });
} else {
  new MyView({
    model: this.model
  }).render().appendNode();
}

因此,正如您所看到的,在success回调中,我们呈现了View。如果您console.log回复,您将会看到您的后端在创建模型时对您做出的回应。

答案 1 :(得分:3)

如果需要,可以在调用{ wait: true }时使用create()选项;这样,模型就不会被添加到集合中,直到它成功保存为止。

将这一点与其余的逻辑相结合发生在集合的add事件上可能需要很长的路要走。如果您需要能够区分新的create' d模型以及稍后添加到集合中的模型,您可以为create调用添加其他选项(例如newlySaved: true ,然后在添加事件回调中检查options.newlySaved