Backbone+Parse.com Collection.fetch() возвращает пустой массив с помощью обратного вызова события

Я начинаю использовать parse.com для разработки веб-приложения, но я застрял на простой проблеме. Я определил модель (или объект в Parse SDK) как:

Book.Model = Parse.Object.extend("book", {
    // Default attributes for the book.
    defaults: {
      title: "placeholder...",
    },

    // Ensure that each book created has `title`.
    initialize: function() {
      if (!this.get("title")) {
        this.set({"title": this.defaults.title});
      }
    },

  });

и коллекция:

Book.List = Parse.Collection.extend({

    // Reference to this collection's model.
    model: Book.Model,

    initialize: function() {
    },

  });

Тогда, если я попробую что-то вроде

   var books = new Book.List();
   books.fetch({
        success: function(collection) {
            console.warn(collection);
        },
        error: function(collection, error) {
           // The collection could not be retrieved.
        }
    });

Все идет хорошо Журнал:

child {length: 5, models: Array[5], _byId: Object, _byCid: Object, model: function…}
_byCid: Object
_byId: Object
length: 5
models: Array[5]
__proto__: EmptyConstructor

НО, если я пытаюсь использовать обратный вызов события вместо метода успеха, я получаю пустой массив. Код:

books.on('reset', this.log());
books.fetch();

    log: function() {
      console.log(books);
    }

и войти:

child {length: 0, models: Array[0], _byId: Object, _byCid: Object, model: function…}
_byCid: Object
_byId: Object
length: 5
models: Array[5]
__proto__: EmptyConstructor

что довольно странно (потому что я думаю, что каждое решение ждет, пока коллекция будет заполнена с сервера). Кто-нибудь знает, почему это происходит?

Я на самом деле использую Backbone Boilerplate и Parse.com js SDK.

1 ответ

Решение

Collection#fetchизменилось поведение, по умолчанию он сбрасывал коллекцию, но с 1.0.0 он объединяет новые модели, используя set:

Когда данные модели возвращаются с сервера, он использует набор (интеллектуально) объединить выбранные модели, если вы не передадите {reset: true}, [...]

а также set не срабатывает "reset" события, это вызывает другие события:

Все соответствующие "add", "remove", а также "change" события происходят так, как это происходит.

Если вы хотите, чтобы ваш fetch чтобы сбросить коллекцию, вы должны сказать так:

books.fetch({ reset: true });
Другие вопросы по тегам