Backbone.js fetch проблема (невозможно обновить данные немедленно)

У меня такой код:

var MyModel = Backbone.Model.extend();

var MyCollection = Backbone.Collection.extend({
    url: '/url/',
    model: MyModel
});
var coll = new MyCollection();

Правильный URL и возвращает правильный json. Но если я попытаюсь использовать следующий код:

$('#fetch').click(function(){
    coll.fetch();
    console.log(coll.toJSON());
});
  • он показывает мне данные только после второго щелчка (http-response в firebug, который я вижу после первого). Похоже, что данные не обновляются вовремя.

Если я помещаю каждый оператор в другое событие, он работает правильно. Но мне нужно знать длину сбора немедленно. Как это сделать?

Ответ 1

Имейте в виду, что fetch - это асинхронный вызов сервера. Чтобы ваш код работал так, как вы ожидали, создайте функцию success, которую Backbone.Collection может вызвать, когда она обновит содержимое с сервера:

$('#fetch').click(function(){
    coll.fetch({
        succcess: function() {
            console.log(coll.toJSON());
        }
    });    
});

Очевидно, что вашему приложению не нужно действительно называть console.log, поэтому пример более реального мира будет использовать привязку к основному событию:

coll.bind('refresh', someFunction);
coll.fetch();

При таком подходе магистраль вызовет someFunction, когда сбор обновится. Это действительно полезно, особенно если someFunction - это функция render вида, к которой вы хотите привязать свою коллекцию.

coll.bind('refresh', yourView.render);
coll.fetch();

Ответ 2

В версии 0.5.0 Collection.refresh был переименован в Collection.reset.

Итак, в ответе Эндрю (что я нашел очень полезным):

coll.bind('refresh', someFunction);

становится

coll.bind('reset', someFunction);