You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一Backbone视图中this可在多数函数识别但在updateModel中失效?

Backbone视图updateModel方法this丢失问题解决方案

问题原因

你在loadData方法中把this.updateModel作为配置参数传入renderComponent时,仅传递了函数的引用,没有绑定该函数的执行上下文。当renderComponent内部调用updateModel时,函数的执行上下文已脱离当前Backbone视图实例,严格模式下this默认值为undefined,因此触发Cannot read property 'trigger' of undefined报错。

其余位置this可正常使用的原因:

  • Backbone视图内置回调(如render、事件绑定的renderMain)会被框架自动绑定视图实例作为执行上下文
  • renderMain中你主动使用_.bind(this.loadData, this)为loadData绑定了上下文,因此loadData内部的this指向正常

修复方案

你可以任选以下任意一种方案修复问题:

  • 传递函数时手动绑定上下文
    修改loadData内的传参逻辑,给updateModel绑定当前视图实例作为上下文,逻辑和你处理setTimeout回调的方式一致:
loadData: function () {
    this.renderComponent(microPlane, {
        model: this.model, 
        updateModel: _.bind(this.updateModel, this) }, 
        '.modelLayout');
}
  • 视图初始化时预绑定方法上下文
    在视图的initialize方法中使用_.bindAll批量固定方法的执行上下文,后续该方法无论以什么形式被调用,this都指向当前视图实例:
initialize: function() {
    // 把所有需要固定上下文的方法都加入参数列表
    _.bindAll(this, 'updateModel', 'loadData');
}
  • 改用ES6箭头函数定义updateModel(环境支持ES6+时可用)
    箭头函数会继承定义位置的执行上下文,不会出现调用时上下文丢失的问题:
updateModel: () => {
    this.trigger('change', this.model);
}

内容的提问来源于stack exchange,提问作者SkyeBoniwell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 06:51:03