Backbone.js: collection.get () Проблемы
-
25-10-2019 - |
Вопрос
Используя Backbone.js, пытаясь выполнить простой () на коллекции после извлечения элементов с сервера.
Fetch, кажется, работает нормально. Однако, когда я пытаюсь получить элемент по ID из коллекции, я получаю неожиданный результат неопределенного, а не модели.
Вот код моего костяка:
Model.Scenario = Backbone.Model.extend({
defaults: function() {
return {
title: 'Scenario',
answer: null,
};
}
});
Collection.Scenarios = Backbone.Collection.extend({
model: Model.Scenario,
url: "data.php",
});
Тогда создание/выброс OBJ с методом маршрутизатора:
var Router = new (Backbone.Router.extend({
routes: {
":id" : "page",
"" : "page"
},
initialize: function() {
_.bindAll(this, 'page');
this.scenarios = new Collection.Scenarios();
this.scenarios.fetch();
console.log(this.scenarios);
console.log(this.scenarios.get(1));
console.log(this.scenarios.get(2));
Backbone.history.start();
},
}))();
Наконец, вот что зарегистрировано до отладчика (чтобы вы могли видеть, что коллекция заполняется):
child
_byCid: Object
_byId: Object
1: child
2: child
3: child
4: child
7: child
10: child
11: child
12: child
13: child
14: child
15: child
16: child
17: child
18: child
19: child
20: child
21: child
22: child
23: child
26: child
27: child
28: child
__proto__: Object
length: 22
models: Array[22]
__proto__: ctor
undefined //first call to get(id)
undefined //2nd call to get(id)
Я озадачен. Извините за долгий пост, но я бы признателен за какое -либо понимание того, что мне не хватает. Спасибо.
Решение
Моя первая мысль состоит в том, что Fetch () не вернулся к тому времени, когда вы делаете свой .get ().
Но если то, что вы опубликовали, это именно то, что происходит, то первая консоль.log (this.scenarios) показывает, что загружен.
В любом случае, вы можете попробовать поместить консоль.
Моя вторая мысль состоит в том, что идентификатор для моделей не установлен правильно.
Backbone.Model по умолчанию использует свойство «ID» в качестве идентификатора для модели, collection.get (id) возвращает модель с идентификатором, в котором вы передали.
Итак, есть ли ответ от Data.php свойство идентификатора?
Попробуйте вместо этого:
var Router = new (Backbone.Router.extend({
routes: {
":id" : "page",
"" : "page"
},
initialize: function() {
_.bindAll(this, 'page');
this.scenarios = new Collection.Scenarios();
this.scenarios.fetch({
success: function(coll, resp) {
console.log(coll);
console.log(coll.first());
console.log(coll.last());
});
Backbone.history.start();
},
}))();
Который должен вернуть первую и последнюю модель и вывести идентификационный выпуск из картинки.
Если это работает, что показывают модели для идентификационного свойства (coll.first (). Id)?