无法通过对象表示法访问骨干集合

时间:2012-01-19 14:38:02

标签: object collections backbone.js

我有一个包含集合的骨干模型。 我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输出时我有了这个集合,但是我没有可用的集合视图,这是需要的地方。

我的路由器中出现了获取操作,我已经创建了一个初始化对象的函数(如果它还没有被初始化)(不知道其他人是怎么做的。我的路由器看起来像这样

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 个答案:

答案 0 :(得分:1)

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

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

要确认这一点,请在获取方法

中添加控制台日志消息
user.fetch({
  success: function(response){
    user.itemlist = new itemlistcollection(response.items)
    console.log(user.itemList)
  }
});

更新

如果希望视图在获取后呈现集合,则会在模型上触发“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));
  }
}