2013-02-21 53 views
1

我对骨干网来说相当陌生,我试图构建一个简单的应用。这是我迄今为止主干返回长度为0

var Election = Backbone.Model.extend(); 

var Elections = Backbone.Collection.extend({ 
    model: Election, 
    url: '/assets/data.json', 

    initialize: function() { 
     console.log('init col'); 
     this.render(); 
     return this; 
    }, 

    render: function() { 
     console.log('rendering the collection'); 
     return this; 
    }, 

// return this 

}); 

    var router = Backbone.Router.extend({ 
    routes: { 
     '': 'root' 
    }, 

    root: function(){ 
     var collection = new Elections(); 
     collection.fetch(); 
     console.log(collection.length); //returns 0 
    } 
}); 
var r = new router(); 

Backbone.history.start(); 

日志是这样的

> init col 
> rendering the collection 
> 0 

但是,当我在控制台中手动创建一个新的集合,它显示了正确的长度和一切,我认为,对于一些路由器通话过早发生的原因,但不知道。这是data.json

[ 
    { 
     "year": 1868, 
     ... 
    }, 
    { 
     "year": 1872, 
     ... 
    }, 

回答

3

fetch执行异步HTTP(阿贾克斯)索取样品,所以你应该通过fetch一个成功回调:

collection.fetch({ 
    success: function(){ 
     console.log(collection.length); 
    } 
}); 
0

扩大对CD的回答一点点,

更好的方法是呼叫fetch,然后使用listenTo调用render变更方法

在你的初始化方法做到这一点

_.bindAll(this, 'render'); 
this.listenTo(this, 'change', this.render); 

,你可以有,如果你想

collection.fetch()

外面取,它会在变化自动更新

+0

能你解释为什么这会更好?不太确定。谢谢:) – alexdmejias 2013-02-21 22:37:39

+0

它只是骨干的方式vs jquery的方式做到这一点.. 更清洁,看看我认为,这是如何在生产中完成 – 2013-02-21 22:41:58

+0

我试图做你所建议的,但我无法得到它上班。 [小提琴](http://jsfiddle.net/QJJN9/3/) – alexdmejias 2013-02-22 14:36:00