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

Backbone model.destroy(): Требуется ли явное удаление из коллекции?

У меня есть простой вопрос. Я смотрю на функцию с двумя строками кода:

deleteTask: function() {
    this.parent.collection.remove(this.model);
    this.model.destroy();
}

Если я прокомментирую первую строку, которая должна удалить модель из своей коллекции, все, кажется, работает так, как предполагалось (например, модель автоматически удаляется). С сайта Backbone это соответствующее обозначение для функции "destroy" модели:

Запускает событие "уничтожить" на модели, которое будет пузыриться через любые коллекции, содержащие его.

Можно ли предположить, что удаление this.parent.collection.remove(this.model); никак не повлияет на функциональность кода? Это то, что я думаю, но я хотел убедиться в этом.

Спасибо!

4b9b3361

Ответ 1

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

//Internal method called every time a model in the set fires an event.
_onModelEvent: function(event, model, collection, options) {
    ...
    if (event === 'destroy') this.remove(model, options);

Итак, да, я бы не подумал, что вам нужно будет удалить модель из вашей коллекции явно.

Но не верьте мне, проверьте сами:)

deleteTask: function() {
    that = this;
    this.model.destroy({
      success: function() {
        console.log(that.parent.collection);
      }
    });
}

Проверьте консоль, чтобы убедиться, что модель была удалена из коллекции.

Ответ 2

Решение состоит в том, чтобы переопределить функцию разрушения модели Backbone. Я сделал это на абстрактной модели с успехом и стратегией обратного вызова:

Параметр "data" соответствует исходному параметру "resp".

destroy: function(successCallback, errorCallback) 
{
    var options = { wait: true };
    var model = this;

    successCallback = successCallback || function() {};
    errorCallback = errorCallback || function() {};               

    var destroy = function() 
    {
        model.trigger('destroy', model, model.collection, options);
    };

    options.success = function(data) 
    {
        if ('SUCCESS' === data.responseCode)
        {
            if (options.wait || model.isNew())
                destroy();

             successCallback(data);

            if (!model.isNew())
                model.trigger('sync', model, data, options);
        }
        else
        {
            errorCallback(data);
        }
    };

    if (this.isNew()) 
    {
        options.success();
        return false;
    }

    var xhr = this.sync('delete', this, options);

    if (!options.wait)
        destroy();

    return xhr;
}