我想知道是否存在保存(POST)或更新(PUT)模型的常用模式,具体取决于该模型的实例是否已存在。我发现自己在我的代码中做了类似的事情
var UserProfileModel = Backbone.Model.extend({
urlRoot: '/api/v1/userprofile'
});
function upsave(){
var userprofile = new UserProfileModel({
user: self.user_id,
user_type: self.user_type,
userprofile_complete: true
});
userprofile.fetch({
success: function(model, response, options) {
//model exists and is now populated
userprofile.set('user_type', self.user_type);
userprofile.set('userprofile_complete', true);
userprofile.save();
},
error: function(model, xhr, options) {
if(xhr.status === 404) {
//model was not found
userprofile.save();
}
else {
alert('The server encountered an error saving the user profiile');
console.log(xhr.status);
}
}
});
};
我从地方获取模型属性,创建新模型,获取模型,如果存在则使用set属性,如果它返回404,则保存。这是一种可接受的设计模式吗?我是骨干的新手,想知道这是否是处理它的正确方法。
此外,在成功保存活动之后,将用户发送到下一个uri的正确方法是什么?我知道你可以这样做:document.location.href = '/some/relative/url/'
这是有效的,但我来自django背景,其中重定向在视图中处理,我不会将URL硬编码到模板中。我不愿意这样做。
答案 0 :(得分:1)
Backbone检查模型是否定义了id,当使用RESTful后端时,该ID应该自然对应于资源的后端id。
如果设置了模型上的id
字段,那么save
将执行PUT请求,否则,它将生成POST请求。
通常,客户端在执行PUT请求之前知道id,因为它意味着更新现有资源 Backbone并不真正关心你如何放置id。您可以按照指示使用GET请求,也可以根据上下文从DOM获取ID。如果它是当前登录用户的用户标识,您还可以将其临时存储在localstorage / cookie / global变量中,并在用户注销时将其删除。这样您就可以避免额外的http请求。
最好通过锚点href立即完成重定向,但如果必须首先执行某些逻辑,我也使用location.href
,因为这似乎是执行客户端重定向的最佳方式。