不能通过对象表示法访问骨干网络

我有一个包含集合的骨干模型。 当我做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函数完成之前被触发,所以当我从fetch输出时我收集了这些集合,但是我没有可用的集合,这是它在哪里需要。

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);
       }
});


这可能是一种竞争条件,因为fetch是一种异步方法。

您在调用this.model.itemList之前是否确认fetch已处理来自服务器的请求?

要确认这一点,请在提取方法中添加控制台日志消息

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

UPDATE

如果您希望视图在获取集合后渲染集合,则会触发模型上的“获取”事件,并让视图绑定到此事件以呈现集合。

以下是如何更新代码的示例

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));
  }
}
链接地址: http://www.djcxy.com/p/53363.html

上一篇: can't access backbone collection through object notation

下一篇: Backbone.js: How to get the index of a model in a Backbone Collection?