在事件中调用渲染时,模型显示为未定义

Model shows as undefined when render is called at event

本文关键字:模型 显示 未定义 事件 调用      更新时间:2023-09-26

我有一个使用以下initialize方法的视图:

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

在渲染方法中,我使用访问模型的内容

var contents = this.model.attributes.content;

模型的content属性是一个数组
因此,当我通过控制台使用model.set()向数组添加内容时,会调用render方法,但我会得到以下错误:Uncaught TypeError: Cannot read property 'attributes' of undefined(…)
但是添加后,如果我手动调用view.render(),它会很好地渲染模型
再次,如果我添加任何内容,它将抛出相同的错误
解决方案?

问题可能是执行render上下文this的值)-由于事件触发器。

如果您放置一个调试器,并在模型更改执行的render中检查this的值,那么它将不会包含view的引用。

您可以通过将第三个参数传递给on来解决这个问题,如主干文档中所指定的:

this.model.on( 'all', this.render, this );

第三个参数是执行render上下文。这意味着,无论您传递什么作为第三个参数,都将是render函数中this的值。

最好使用listenTo而不是on,因为它以比on更好的方式清理事件。你可以在stackoverflow问题Backbone js.listenTo vs.on.上阅读到对同样事情的解释

因此初始化将写为:

initialize: function() {
    this.listenTo( this.model, 'all', this.render );
}

此外,我建议使用model中可用的get方法来访问其属性,因此使用this.model.get( 'content' )代替this.model.attributes.content访问content

希望有帮助:)

因为您正在使用this.model.on("all", this.render)进行侦听您的render函数将获取模型作为上下文,即当回调被调用时,"this"将引用模型。尝试使用this.listenTo(this.model, "all", this.render)。通过这种方式,您可以设置上下文。