Проверка позвоночника / Javascript: не удается получить модели из коллекции - PullRequest
1 голос
/ 20 декабря 2011

Просто начинаю с магистрали, и я немного запутался, как извлекать модели из коллекции. Чтобы дать объяснение, у меня есть следующий метод маршрутизатора:

index: (date) ->
  @days = new Demomanager.Collections.DaysCollection(@options)
  @days.reset @options.days
  @days.fetch()
  @view = new Demomanager.Views.Days.IndexView(days: @days)
  $("#calendar").html(@view.render().el)

, который переходит к следующему виду:

class Demomanager.Views.Days.IndexView extends Backbone.View
  template: JST["backbone/templates/days/index"]

  initialize: (options) ->
    _.bindAll(this, 'addOne', 'addAll', 'render')
    @options.days.bind('reset', @addAll)
    console.log @options.days

Когда я проверяю последнюю строку в представлении (@ options.days) в инспекторе Chrome, он возвращается с DaysCollection, который включает в себя массив моделей с 36 записями (как и ожидалось).

Однако, когда я меняю

console.log @options.days

до

console.log @options.days.models

Я получаю пустой массив вместо массива с 36 моделями.

Наконец, если я получу доступ к тому же объекту через саму консоль (window.router.days.models), он покажет 36 моделей, как и ожидалось.

Итак, вкратце: что происходит и как я могу получить доступ к этим моделям из вида?

Большое спасибо ...

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

Может быть, это причина того, что вы делаете асинхронный вызов. Поэтому, когда вы регистрируете options.days в конструкторе вашего представления, данные еще не были загружены. Было бы лучше создать ваше представление в обратном вызове успеха days.fetch. Делая это таким образом, вы также можете запустить другое представление при сбое загрузки.

1 голос
/ 20 декабря 2011

Вы хотите переместить ваш выбор к вашему виду:

var IndexView = Backbone.View.extend({
    collection: new Demomanager.Collections.DaysCollection(options),
    template: myTemplate,

    initialize: function() {
        $("#calendar").html(_.template(myTemplate, {}));

        this.collection.fetch();
        this.collection.reset(null, options.days); // don't know how coffeescript works, but first arg here is models set not the options object

        this.collection.bind("add", this.addOne, this);
    },


    addAll: function() {
        this.collection.each(this.addOne, this);
    },
    addOne: function(model) {
        $(this.el).append(new ChildView({model: model}));
    }

});
...