2013-04-02 59 views
0

我正在与backbone.js玩弄,并陷入僵局。这里是我的代码:隐藏Backbone.js模型

window.Car = Backbone.Model.extend(); 
window.CarCollection = Backbone.Collection.extend({ 
    model: Car, 
    url:"../api/car/", 

}); 

window.CarListView = Backbone.View.extend({ 
    tagName:'ul', 

    initialize: function() { 
     this.model.on("reset", this.render); 
    }, 

    render: function (eventName) { 
     console.log(this.model);  //is an object 
     console.log(this.model.models); //is an empty array 

     return this; 
    }, 
}); 

// Router 
var AppRouter = Backbone.Router.extend({ 

    routes:{ 
     "":"list", 
     "cars/:id":"carDetails" 
    }, 

    list:function() { 
     this.carList = new CarCollection(); 
     this.carListView = new CarListView({model:this.carList}); 
     this.carList.fetch(); 
     $('#sidebar').html(this.carListView.render().el); 
    }, 

}); 

$(function() { 
    app = new AppRouter(); 
    Backbone.history.start(); 
}); 

我没有足够的信誉发表图片,所以这里是从Chrome开发人员工具控制台的文本版本:

V r {length: 0, models: Array[0], _byId: Object, _events: Object, constructor: function…} 
    > _byId: Object 
    > _events: Object 
    > length: 4 
    > models: Array[4] 
    > __proto__: s 

我的问题是,我试图访问似乎“隐藏”在空白背后的非空模型属性。如何访问长度为4的模型属性?

回答

1

这是一个控制台怪癖,但这里的核心问题很常见 - 您打电话给.fetch()(异步加载),然后立即调用.render(),期望加载数据。您需要等到才可以访问它的数据加载 - 有几种方法可以做到这一点,但最简单的可能是通过一个success回调fetch

var carListView = this.carListView; 
this.carList.fetch({ 
    success: function() { 
      $('#sidebar').html(carListView.render().el); 
    } 
}); 

控制台日志这个奇怪的,因为当当收集尚未加载(显示Array[0])时,请致电console.log,但在加载完成后手动检查它(显示Array[4])。

+0

感谢,有两件事:1:该代码导致'未捕获的ReferenceError:carListView未定义'。 2:我认为绑定'重置'事件会导致渲染函数在数据被提取后被调用? –

+1

1.哎呀,你是对的 - 看看编辑。您需要将视图别名为变量,因为'this'引用在回调中不起作用。 2.'reset'监听器应该可以工作,但是在你调用'.fetch()'之后,你首先明确地调用'carListView.render()'。 – nrabinowitz