Backbone.js:创建或更新模式,发布保存模式

时间:2015-03-02 14:34:57

标签: backbone.js

我想知道是否存在保存(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硬编码到模板中。我不愿意这样做。

1 个答案:

答案 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,因为这似乎是执行客户端重定向的最佳方式。