Backbone.js - model.save()没有触发PUT请求

时间:2013-06-20 20:39:32

标签: backbone.js put backbone-model

我有一个使用Backbone.js的基本应用程序,它没有进行PUT调用(更新模型)。从前端开始,我调用模型save函数没有进行PUT调用;但是,如果我用destroy替换它,它会对后端进行DELETE调用。任何人都知道可能是什么问题?未触发PUT请求的函数是saveTask函数。

App.Views.Task = Backbone.View.extend({
    template: _.template("<label>ID:</label><input type='text' id='taskId' name='id' value='<%= _id %>' disabled /><br><label>Title:</label><input type='text' id='title' name='title' value='<%= title %>' required/><br><label>Content:</label><input type='text' id='content' name='content' value='<%= content %>'/><br><button class='save'>Save</button>"),
    events: {
        "change input":"change",
        "click .save":"saveTask"
    },
    render: function(eventName){
        $(this.el).html(this.template(this.model.toJSON()));
        //console.log(this.generateTemplate());
        return this;
    },
    change: function(event){
        var target = event.target;
        console.log('changing ' + target.id + ' from: ' + target.defaultValue + ' to: ' + target.value);
        change[target.name] = target.value;
        this.model.set(change);*/
    },
    saveTask: function(){
        this.model.set({
            title:$("#title").val(),
            content:$("#content").val()
        });
        if(this.model.isNew()){
            App.taskList.create(this.model);
        } else {
            this.model.save({});
        }
    }
});

4 个答案:

答案 0 :(得分:19)

如果您的模型是新的,那么在您保存它时它将触发一个post方法。 如果您的模型不是新的并且您正在更新它,它将触发PUT。

如果这对您不起作用,可能是因为您的模型没有id属性,以防您使用具有不同名称的id,例如taskID,那么在您的模型中,您必须将idAttribute设置为taskID所以骨干使用这个属性作为Id,一切都会正常。

像这样:

 var Task= Backbone.Model.extend({
   idAttribute: "taskId"
 });

这是Idattibute文档的链接 http://backbonejs.org/#Model-idAttribute

另一个问题可能是保存通话中的{} 试试吧

 this.model.save(); 

而不是

 this.model.save({});

答案 1 :(得分:2)

我相信模型总是期待选项参数,也可能是回调

this.model.save(null, {
    success: function (model, response) {

        //
    },
    error: function () {
        //
    }
});

如果你看一下Backbone src,你也会注意到......

==

// Set a hash of model attributes, and sync the model to the server.
// If the server returns an attributes hash that differs, the model's
// state will be `set` again.
save: function (key, val, options) {
    var attrs, method, xhr, attributes = this.attributes;

    // Handle both `"key", value` and `{key: value}` -style arguments.
    if (key == null || typeof key === 'object') {
        attrs = key;
        options = val;
    } else {
        (attrs = {})[key] = val;
    }

    options = _.extend({
        validate: true
    }, options);

    // If we're not waiting and attributes exist, save acts as
    // `set(attr).save(null, opts)` with validation. Otherwise, check if
    // the model will be valid when the attributes, if any, are set.
    if (attrs && !options.wait) {
        if (!this.set(attrs, options)) return false;
    } else {
        if (!this._validate(attrs, options)) return false;
    }

    // Set temporary attributes if `{wait: true}`.
    if (attrs && options.wait) {
        this.attributes = _.extend({}, attributes, attrs);
    }

    // After a successful server-side save, the client is (optionally)
    // updated with the server-side state.
    if (options.parse === void 0) options.parse = true;
    var model = this;
    var success = options.success;
    options.success = function (resp) {
        // Ensure attributes are restored during synchronous saves.
        model.attributes = attributes;
        var serverAttrs = model.parse(resp, options);
        if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
        if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {
            return false;
        }
        if (success) success(model, resp, options);
        model.trigger('sync', model, resp, options);
    };
    wrapError(this, options);

    method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
    if (method === 'patch') options.attrs = attrs;
    xhr = this.sync(method, this, options);

    // Restore attributes.
    if (attrs && options.wait) this.attributes = attributes;

    return xhr;
},

答案 2 :(得分:2)

在我的情况下,由于验证而失败。当我保存模型时,它验证了模型的所有属性,我用于列出界面的集合并不需要模型的所有属性。

我遇到了同样的问题并在谷歌搜索并找到了你的问题并阅读了解决方案和评论。我意识到在更新的主干规范中,提到当model.save()在模型请求之前执行时,它首先调用验证并且如果验证成功,它将继续其他方式失败,这就是为什么它没有在chrome调试器网络选项卡中显示任何网络请求。

我已经为我所面临的案件编写了解决方案,其他人可能面临不同的问题。

答案 3 :(得分:0)

Backbone的sync function是我最后使用的。您必须传递'update'作为第一个参数('method'参数)。