Какие события вызывают при вызове fetch() в коллекции Backbone.js?
В моем приложении backbone.js есть Trips collection
, который содержит Trip models
, который работает с LocalStorage
. Я могу вызвать Trips.create(form_attributes)
для создания и сохранения поездки в Todos store
.
Когда я впервые загружаю свое приложение, я вызываю Trips.fetch({ success: trips_fetch_success })
, а trips_fetch_success
получает ответ, который показывает Trip models
, что имеет место Trips collection
.
Я попытался связать события refresh
и change
с Trips collection
, но эти события не пойманы, заставив меня поверить, что у меня неправильное представление о том, какие события Trips.fetch
запускаются.
Мой вопрос: какие события должны срабатывать Trips.fetch
? И происходят ли события в коллекции или на каждом из отдельных Trip models
?
Ответы
Ответ 1
Collection.fetch()
будет называть reset
успешным, что, в свою очередь, вызовет событие 'reset. Любые подписчики коллекции reset должны получить событие.
Ключевым моментом здесь является "об успехе". У меня была эта проблема, только чтобы обнаружить, что позвоночник молча проглотил мои сообщения об ошибках. Передайте обработчик ошибок, который, по крайней мере, записывается в console.log()
и видит, что происходит:
trips.fetch({error: function() { console.log(arguments); }});
(Примечание: старые версии backbone.js вызывают "обновление" вместо "reset" )
Ответ 2
Если вы используете backbone 1.0, вам нужно передать reset: true в вызове fetch(), чтобы связать с событием reset:
trips.fetch({reset: true});
Ответ 3
Начиная с магистральной версии 1.0, model.fetch() запускает "синхронизацию". Это то, что вы должны связать.
Вот соответствующая часть из источника backbone.js, где происходит событие sync:
fetch: function(options) {
options = options ? _.clone(options) : {};
if (options.parse === void 0) options.parse = true;
var model = this;
var success = options.success;
options.success = function(resp) {
if (!model.set(model.parse(resp, options), options)) return false;
if (success) success(model, resp, options);
// HERE THE TRIGGER!
model.trigger('sync', model, resp, options);
};
wrapError(this, options);
return this.sync('read', this, options);
},