Вопрос

У меня есть модель основы 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 уже вернулся и заполнил коллекцию.

надеюсь, это поможет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top