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

.save() на существующей модели вызывает POST вместо PUT

У меня возникли проблемы с сохранением изменений в отдельных моделях в коллекции. Модели, которые были загружены (через коллекцию .reset()), выдает POST (как если бы они были новыми) вместо ожидаемого PUT.

Здесь подход, который я принимаю:

APPVIEW

  • Загружает дочернюю коллекцию с помощью this.model.childcollection.reset(JSON DATA FROM SERVER);

  • В этой функции рендеринга создается новый дочерний элемент для каждого элемента в коллекции и отображает его:

    render: function() {
            var el = this.el;
            this.model.childcollection.forEach(function(s) {
            var view = new ChildView({ model: s });
            el.append(view.render().el);
        });
        return this;
    },
    

ChildView

  • В одном из своих событий он меняет некоторые значения базовой модели и вызывает сохранение:

    this.model.set(
            {
                ValueA: somevalue,
                ValueB: somevalue
            },
            {
                error: function() {
                    console.log("Error saving model");
                },
                success: function() {
                    console.log("Model change saved");
                }
            });
        this.model.save();
    

замечания:

  • POST (без дочернего id) вызывается вместо PUT (с дочерним идентификатором)
  • У дочерних элементов установлены идентификаторы

Может ли кто-нибудь сказать мне, почему это может происходить?

4b9b3361

Ответ 1

Массив

использовал свойство .id (а не атрибут) модели, чтобы определить, следует ли его помещать или публиковать, как показано здесь в исходном коде: https://github.com/documentcloud/backbone/blob/master/backbone.js#L344-346

если он выполняет запись при сохранении существующей модели, это означает, что свойство .id не загружено правильно. даже если вызов model.get("id") возвращает правильный результат, вызов model.id должен вернуть правильный результат, чтобы он знал, что это не новая модель.

убедитесь, что атрибут идентификатора модели называется id, или, если это не так, обязательно установите idAttribute в своей модели:

MyModel = Backbone.Model.extend({
  idAttribute: "myCustomId"
});