Как узнать, когда заканчивается базовая модель model.fetch()?

Я связываюсь с событием изменения моих базовых моделей следующим образом.

this.model.on( "change", this.render, this );

Иногда я хочу получить последнюю версию модели и принудительно отобразить представление. Поэтому я делаю это

this.model.fetch();

К сожалению, model.fetch() только запускает событие изменения, если новые данные отличаются от ранее сохраненных в модели.

Как я могу всегда запускать обратный вызов this.render после завершения выборки, вызывает ли это событие изменения или нет?

Спасибо (заблаговременно) за вашу помощь

Ответ 1

Вы можете использовать обратный вызов успеха $.ajax, но вы также можете просто прослушать события Backbone sync и error на модели. sync срабатывает после успешного вызова сервера, error запускается после неудачного вызова сервера.

this.model.on('sync', this.render, this);
this.model.on('error', this.handleError, this);

Ответ 2

Метод fetch может опционально принимать успешные и обратные вызовы ошибок; самое простое решение - поместить вас в render в обратном вызове. Возможно, вы также можете использовать возвращенное обещание jqXHR, но если когда-нибудь будет случай, когда AJAX будет успешным (за jQuery), но инициализация модели не удастся, это использование может быть проблематичным.

Ответ 3

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

var that = this;
this.model.fetch().done(function () {
    that.render();
});

else, если вы выбираете модель за пределами своего вида, вы можете передать свое обещание своему мнению и сделать что-то подобное

var promise = model.fetch();
// other code here
var view = new View({
    model: model,
    promise: promise
});

и внутри вашего представления, например, при инициализации

View = Backbone.View.extend({
    initialize: function(){
        this.options.promise.done(function () {
            // your code here
        });
    }
});

Ответ 4

Как насчет этого решения:

// emit fetch:error, fetch:success, fetch:complete, and fetch:start events
fetch: function(options) {
  var _this = this;

  options = options || {};

  var error = options.error;
  var success = options.success;
  var complete = options.complete;

  options.error = function(xhr, textStatus, errorThrown) {
    _this.trigger('fetch:error');
    if (error) error(xhr, textStatus, errorThrown);
  };

  options.success = function(resp) {
    _this.trigger('fetch:success');
    if (success) success.call(options.context, resp);
  };

  options.complete = function() {
    _this.trigger('fetch:complete');
    if (complete) complete();
  };

  _this.trigger('fetch:start');

  return Backbone.Model.prototype.fetch.call(this, options);
}

Ссылка на gist https://gist.github.com/fedyk/23761ce1236c5673fb84