我正试图围绕Backbone进行思考(正如我最近的一系列问题所表明的那样......)。特别是我正在完成这个项目:
https://github.com/ccoenraets/nodecellar http://nodecellar.coenraets.org/#
我想在概念上理解当我点击新葡萄酒上的“保存”按钮时会发生什么,例如:
http://nodecellar.coenraets.org/#wines/506df6b6849a990200000001
我认为它是这样的:
1)Backbone winedetails视图捕获保存按钮单击作为事件并启动“保存前”方法。请参阅下面的/public/js/views/winedetails.js。
beforeSave: function () {
var self = this;
var check = this.model.validateAll();
if (check.isValid === false) {
utils.displayValidationErrors(check.messages);
return false;
}
this.saveWine();
return false;
},
saveWine: function () {
var self = this;
console.log('before save');
this.model.save(null, {
success: function (model) {
self.render();
app.navigate('wines/' + model.id, false);
utils.showAlert('Success!', 'Wine saved successfully', 'alert-success');
},
error: function () {
utils.showAlert('Error', 'An error occurred while trying to delete this item', 'alert-error');
}
});
},
在Save方法(第二种方法)中,调用this.model.save。某些模型保存方法必须向'/ wines'URL发出PUT请求,如server.js文件中所示(这是针对node.js服务器):
app.get('/wines', wine.findAll);
app.get('/wines/:id', wine.findById);
app.post('/wines', wine.addWine);
app.put('/wines/:id', wine.updateWine);
app.delete('/wines/:id', wine.deleteWine);
从那里显然它运行了route / wines.js中定义的addWine方法。我不明白的是,MODEL如何理解发送请求的URL。我找不到任何将model.save方法与正确的REST API相关联的地方。我的问题有意义吗?
答案 0 :(得分:1)
等等我可能已经回答了我自己的问题。它必须是以下行:/public/js/models/models.js
urlRoot:“/ wines”
然后Backbone知道你是否正在做一个“新”模型它必须发送一个POST请求。如果你正在进行更新,它必须将:id附加到URL并发送PUT请求,等等。它是如何工作的?
答案 1 :(得分:1)
以下是模型urlRoot的文档:http://backbonejs.org/#Model-urlRoot
如果您在模型上指定了urlRoot
,它将使用它。如果模型是集合的一部分,它将引用集合上的url属性。
当saving时,Backbone将使用PUT进行更新,并使用POST进行创建。它根据isNew函数的结果确定应该使用哪个。这将检查模型是否具有id属性。