我有一个使用以下initialize
方法的视图:
initialize: function(){
this.model.on("all", this.render)
},
在render方法中,我使用:
访问模型的内容var contents = this.model.attributes.content;
模型的content
属性是一个数组
所以当我通过控制台使用model.set()
向数组添加内容时,会调用render方法,但是我收到以下错误:Uncaught TypeError: Cannot read property 'attributes' of undefined(…)
。
但是在我添加后,如果我手动调用view.render()
,它会很好地渲染模型
再次,如果我添加任何东西,它会抛出相同的错误
溶液
答案 0 :(得分:3)
由于事件触发器,问题可能是执行this
的上下文(render
的值)。
如果您要调试器并检查this
内部render
的值,该值由模型更改执行,则不会保留view
的引用。
您可以通过将第三个参数传递到backbone documentation中指定的on
来解决此问题:
this.model.on( 'all', this.render, this );
第三个参数是上下文,其中render
将被执行。意思是,无论你传递给第三个参数,都是this
函数中render
的值。
最好使用listenTo
代替on
,因为它以比on
更好的方式清理事件。您可以在stackoverflow问题Backbone js .listenTo vs .on处阅读相同内容的精彩解释。
因此初始化将写为:
initialize: function() {
this.listenTo( this.model, 'all', this.render );
}
另外,我建议您使用get
中提供的model
方法来访问其属性,因此不要通过content
访问this.model.attributes.content
使用this.model.get( 'content' )
}。
希望有所帮助:)
答案 1 :(得分:1)
因为您正在使用this.model.on("all", this.render)
进行聆听
你的渲染函数将把模型作为上下文,即当回调被调用时,这个'将参考模型。尝试使用
this.listenTo(this.model, "all", this.render)
。这样您就可以设置上下文。