не может получить доступ к коллекции магистрали через нотацию объекта - PullRequest
0 голосов
/ 19 января 2012

У меня есть модель позвоночника с коллекцией.Вывод с консоли, когда я делаю console.log(this.model),

d
_changed: false
_changing: false
_escapedAttributes: Object
_previousAttributes: Object
attributes: Object
cid: "c1"
id: 63
itemlist: d
  _byCid: Object
  _byId: Object
  _onModelEvent: function () { [native code] }
  _removeReference: function () { [native code] }
  length: 5
  models: Array[5]
  __proto__: o
url: "user/63"
__proto__: o

идеально!теперь я хочу получить коллекцию itemlist, чтобы я мог сделать this.model.itemlist.each(render(item)).

Но когда я пытаюсь вывести console.log(this.model.itemlist), я получаю пустую коллекцию

d
 _byCid: Object
 _byId: Object
 _callbacks: Object
 _onModelEvent: function () { [native code] }
 _removeReference: function () { [native code] }
 length: 0
 models: Array[0]
 parent: d
 __proto__: o

Я не уверен, почему, когда я вывожу модель, я вижу вложенную коллекцию.почему я не могу попасть в коллекцию?или как мне попасть в коллекцию.

Я создаю вложенную коллекцию через

user.fetch({
    success: function(response){
              user.itemlist = new itemlistcollection(response.items)
       }
});

----------------- обновление -----------------

, поскольку @Paul помогает мне обнаружить, что представления запускаются до завершения функции извлечения, поэтому у меня есть коллекция, когда я выводлю из fetch, но я неДля того чтобы коллекция была доступна в представлении, где она необходима.

В моем маршрутизаторе происходит действие выборки, я создал функцию для инициализации объекта, если он еще не был инициализирован (не уверен, как другие к этому. Мой роутер выглядит так

User.Router = Backbone.Router.extend ({
     routes: {

        "user/new":  "newUser",
        "user/:id":  "userView"
        "":             "index"
    },

    re_initialize: function(id){
           user.fetch({
              success: function(response){
              user.itemlist = new itemlistcollection(response.items)
             }
          });
      },

       userView: function(){

       console.log(user.itemlist);
       new User.View(user);
       }
});

1 Ответ

1 голос
/ 19 января 2012

Это может быть состояние гонки, поскольку fetch является асинхронным методом.

Подтвердили ли вы, что fetch обработал запрос с сервера, прежде чем позвонить this.model.itemList?

Чтобы подтвердить это, добавьте сообщение журнала консоли в метод выборки

user.fetch({
  success: function(response){
    user.itemlist = new itemlistcollection(response.items)
    console.log(user.itemList)
  }
});

UPDATE

Если вы хотите, чтобы представление отображало коллекцию после ее извлечения, вы запускаете событие 'fetched' в вашей модели и привязываете представление к этому событию для отображения коллекции.

Вот пример того, как вы можете обновить свой код

user.fetch({
  success: function(response){
    user.itemList = new itemlistcollection(response.items);
    user.trigger('fetched');
  }
});

yourView = Backbone.View.extend({
  initialize: function() {
    this.model.bind('fetched', this.renderList, this);
  },

  renderList: function() {
    this.model.itemList.each(render(item));
  }
}
...