2013-02-07 66 views
0

我在写一个backbone.js应用程序,并且遇到问题。 我的收藏不会引发事件,任何人都可以在代码下面发现问题吗?我得到了渲染反馈,初始化器反馈......但append方法从未被调用过。我知道“../app”返回一个包含tro json项目的列表。我甚至可以看到这些是在收集中创建的。 为什么我的活动没有被叫?backbone.js不会触发我的事件

window.TablesInspectorView = Backbone.View.extend({ 

    tagName: "div", 

    initialize: function() { 
     console.log('Initializing window.TablesInspectorView');   

     // setup the tables 
     this.data  = new Backbone.Collection(); 
     this.data.url = "../app"; 
     this.data.fetch(); 

     // some event binds.. 
     this.data.on("change", this.render  , this); 
     this.data.on("add" , this.append_item, this); 
    }, 
    render: function(){ 
     console.log("render"); 
     _.each(this.data.models, this.append_item); 
    }, 
    append_item: function(item) { 
     console.log("appended"); 
    } 
}); 
+0

当你取一个集合,你会得到一个“复位”事件,而不是“添加”。 –

+0

在调用获取方法之前,您是否尝试过绑定事件? – Corey

+0

@paulHoenecke:你的权利,除了'重置'事件取代'更改'..但这并没有解决问题 - 添加事件应该仍然被激发一次收集每个项目.. –

回答

2

据我所知,骨干取()是一个异步事件,当它完成了复位事件被触发,

当属于集合(this.data)的模型修改后,更改事件被触发,所以即时猜测你没有得到正确的部分。

,所以我会做这样的事情:

window.TablesInspectorView = Backbone.View.extend({ 

    tagName: "div", 

    initialize: function() { 
     console.log('Initializing window.TablesInspectorView');   

     // setup the tables 
     this.data  = new Backbone.Collection(); 
     this.data.url = "../app"; 
     this.data.fetch(); 

     // some event binds.. 
     this.data.on("reset", this.render  , this); //change here 
     this.data.on("add" , this.append_item, this); // i dont see a this.data.add() in you code so assuming this was never called ? 
    }, 
    render: function(){ 
     console.log("render"); 
     _.each(this.data.models, this.append_item); 
    }, 
    append_item: function(item) { 
     console.log("appended"); 
    } 
}); 
+0

有关“重置”事件的响应是正确的,但我有一些意见...你不应该直接访问模型属性,集合代理大多数下划线方法,因此你可以做this.data.each(this.append_item);一旦fetch()完成并且重置事件被触发,您可以使用该事件来呈现视图(但不会将项目添加到集合中,因为它们已经存在),我不明白为什么要将项添加到集合上渲染。 –