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

jxct1oxe  于 2022-11-10  发布在  其他
关注(0)|答案(4)|浏览(198)

我有一个使用Backbone.js的基本应用程序,它没有进行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({});
        }
    }
});
zu0ti5jz

zu0ti5jz1#

如果你的模型是新的,那么在你保存它的时候,它会触发一个post方法。但是如果你的模型不是新的,并且你正在更新它,它会触发一个PUT方法。
如果这对你不起作用,那可能是因为你的模型没有id属性,如果你使用一个不同名字的id,比如taskID,那么在你的模型中你必须把idAttribute设置为taskID,这样 Backbone.js 就把这个属性作为Id,一切都正常了。
就像这样:

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

以下是Idattibute www.example.com上文档的链接http://backbonejs.org/#Model-idAttribute
另一个问题可能是{}在您的保存调用尝试只是

this.model.save();

而不是

this.model.save({});
qlvxas9a

qlvxas9a2#

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

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;
},
pinkon5k

pinkon5k3#

在我的例子中,由于验证的原因,它失败了。当我保存模型时,它验证了模型的所有属性,而我用于列表界面的集合并不需要模型的所有属性。
我也遇到了同样的问题,在谷歌搜索,找到了你的问题,阅读了解决方案和评论。然后我意识到,在更新的 Backbone.js 规范中提到,当model.save()在模型请求之前执行时,它首先调用validate,如果validate成功,它将继续,否则失败,这就是为什么它没有在chrome调试器网络选项卡中显示任何网络请求的原因。
我已经为我所面临的情况写了解决方案,其他人可能面临不同的问题。

ltskdhd1

ltskdhd14#

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

相关问题