Проблема получения Backbone.js (невозможно обновить данные немедленно) - PullRequest
14 голосов
/ 18 мая 2011

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

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 я вижу после первого).Кажется, что данные не обновляются во времени.

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

Ответы [ 2 ]

24 голосов
/ 18 мая 2011

Имейте в виду, что 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();
6 голосов
/ 27 ноября 2011

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

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

coll.bind('refresh', someFunction);

становится

coll.bind('reset', someFunction);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...