Подтвердить что ты не робот

Backbone.js - model.save() не запускает запрос PUT

У меня есть базовое приложение, использующее 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({});
        }
    }
});
4b9b3361

Ответ 1

Если ваша модель новая, то в то время, когда вы ее сохраните, она будет запускать почтовый метод. Если ваша модель, однако, не является новой и вы ее обновляете, она запускает PUT.

если это не работает для вас, это может быть связано с тем, что ваша модель не имеет свойства id, если вы используете идентификатор с другим именем, например taskID, то в вашей модели вам необходимо установить idAttribute taskID, поэтому базовая система использует это свойство как Id, и все будет нормально.

вот так:

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

вот ссылка на документацию по Idattibute http://backbonejs.org/#Model-idAttribute

также может возникнуть проблема {} в вызове сохранения попробуйте просто

 this.model.save(); 

вместо

 this.model.save({});

Ответ 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;
},

Ответ 3

В моем случае это происходит из-за валидации. Поскольку я сохраняю модель, она проверяет все атрибуты модели, и коллекция, которую я использую для интерфейса листинга, не требует всех атрибутов модели.

Я столкнулся с теми же проблемами и поиском в Google, и нашел ваш вопрос и прочитал решение и комментарии. Когда я понимаю, что в обновленных базовых спецификациях упоминается, что когда model.save() выполняется перед запросами модели, он сначала вызывает подтвердите, и если проверка будет успешной, чем это произойдет, другие мудрые не удастся, и именно по этой причине она не отображает сетевой запрос на вкладке chrome debugger network.

Я пишу решение для случая, с которым сталкиваюсь, другие могут столкнуться с различными проблемами.

Ответ 4

Backbone функция синхронизации - это то, что я использовал. Вы должны передать "обновление" в качестве первого параметра (параметр "метод" ).