Как узнать, когда заканчивается базовая модель 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