Исчезающие модели в сборе костей
-
22-10-2019 - |
Вопрос
У меня есть модель основы line
который содержит коллекцию модели Stop
Анкет В какой -то момент я хочу перевести через остановки в линии и получить общее время прохождения вдоль линии, используя функцию подчеркивания. reduce
.
Это не работает, однако. Кажется, что что -то происходит с коллекцией в какой -то момент. Похоже, он содержит только один объект без значимых атрибутов, хотя я точно знаю, что он был заполнен четырьмя моделями остановки с достоверными атрибутами.
Модель:
App.models.Line = Backbone.Model.extend({
initialize: function() {
var stops = new App.models.Stops({
model: App.models.Stop,
id: this.get("id")
});
stops.fetch();
this.set({
stops: stops
});
this.set({unique: true});
this.calculateTotalTime();
},
calculateTotalTime: function() {
this.get("stops").each(function(num) {
console.log("Model!");
});
console.log("Unique: ", this.get("unique"));
}
});
Консольная распечатка:
Model!
Unique: true
Должно быть четыре «модель!», Поскольку количество моделей составляет четыре.
Самое странное, что в консоли все отлично работает:
window.line.get("stops").each(function(num) {
console.log("Model!");
});
Model!
Model!
Model!
Model!
JS составлен с звездочками:
//= require ./init
//= require ./lib/jquery
//= require ./lib/underscore
//= require ./lib/backbone
//= require ./lib/raphael
//= require_tree ./controllers
//= require_tree ./models
//= require_tree ./views
//= require ./main
init.js:
window.App = {};
App.views = [];
App.models = [];
main.js:
$(function() {
window.line = new App.models.Line({name: "4", id: 4});
window.lineView = new App.views.Line({model: line});
$("#outer").append(lineView.render().el);
});
Какое -то другое странное поведение:
console.log(this.get("stops"))
В модели дает этот довольно нормальный объект:
child
_byCid: Object
_byId: Object
_onModelEvent: function () { [native code] }
_removeReference: function () { [native code] }
id: 4
length: 4
models: Array[4]
0: Backbone.Model
1: Backbone.Model
2: Backbone.Model
3: Backbone.Model
length: 4
__proto__: Array[0]
__proto__: ctor
Но призыв console.log(this.get("stops").models)
, что должно дать массив, возвращает только это, массив одного объекта без полезных атрибутов:
[
Backbone.Model
_callbacks: Object
_changed: false
_changing: false
_escapedAttributes: Object
_previousAttributes: Object
attributes: Object
id: 4
model: function (){ return parent.apply(this, arguments); }
__proto__: Object
cid: "c1"
id: 4
__proto__: Object
]
Я подозреваю, что все зависит от некоторого недопонимания о природе this
. Анкет Рад за любую помощь.
Решение
stops.fetch()
является асинхронным процессом, поэтому код, который вы написали сразу после того, как он, вероятно, будет сбросить до того, как результаты выбора вернется с сервера.
Вам нужно будет изменить свой код, чтобы запустить все после того, как возвращается выборка. самый простой способ сделать это - с reset
событие от stops
коллекция:
App.models.Line = Backbone.Model.extend({
initialize: function() {
var stops = new App.models.Stops({
model: App.models.Stop,
id: this.get("id")
});
// store the stops, and then bind to the event
this.set({stops: stops});
stops.bind("reset", this.stopsLoaded, this);
stops.fetch();
},
stopsLoaded: function(){
// get the stops, now that the collection has been populated
var stops = this.get("stops");
this.set({unique: true});
this.calculateTotalTime();
},
calculateTotalTime: function() {
this.get("stops").each(function(num) {
console.log("Model!");
});
console.log("Unique: ", this.get("unique"));
}
});
Причина, по которой он работает в вашей консоли, заключается в том, что к тому времени, когда вы вводите код, чтобы оценить остановки модели, fetch
Call уже вернулся и заполнил коллекцию.
надеюсь, это поможет