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 });