在事件中调用render时,模型显示为undefined

时间:2016-07-28 05:49:19

标签: javascript backbone.js models

我有一个使用以下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(),它会很好地渲染模型 再次,如果我添加任何东西,它会抛出相同的错误 溶液

2 个答案:

答案 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)。这样您就可以设置上下文。