Odoo 16继承JS函数时首次调用出现this._super未定义的问题咨询
Odoo 16继承JS函数时首次调用出现this._super未定义的问题咨询
嗨,这个问题我之前定制Odoo 16看板视图的时候也踩过坑!让我给你拆解下原因和最优解决方案~
问题根源
你当前用的this._super是Odoo旧版JS框架(比如14及更早版本)里的写法,但Odoo 16已经全面切换到Owl 2框架,采用标准ES6类的继承/补丁机制。旧的this._super绑定逻辑在首次调用时,会因为实例方法提前绑定或者补丁未完全初始化的问题,导致this._super没有被正确挂载,所以第一次点击会报错;而第二次点击时,实例已经完成了补丁的初始化,this._super才正常绑定。
最优解决方案:改用ES6标准的super关键字
Odoo 16的web.utils.patch工具已经适配了Owl 2的ES6类机制,我们可以直接用super关键字调用父类方法,完全替代this._super的写法,既能解决首次调用的问题,也更符合现代JS规范:
/** @odoo-module **/ import { StockBarcodeKanbanController } from '@stock_barcode/kanban/stock_barcode_kanban_controller'; import { patch } from 'web.utils'; import { useService } from "@web/core/utils/hooks"; // 直接patch类本身,而非prototype patch(StockBarcodeKanbanController, 'StockBarcodeKanbanControllerIchExt', { setup() { // 用super.setup替代this._super.apply的旧写法 super.setup(...arguments); this.rpc = useService("rpc"); }, async openRecord(record) { // 直接通过super调用父类的openRecord方法 return super.openRecord(record); }, });
为什么这个写法更靠谱?
Odoo官方在16版本里推荐用这种ES6标准的补丁方式,super关键字会直接指向父类的原始方法,不存在绑定时机的问题,从根本上避免了首次调用_super未定义的bug。而且这种写法更简洁,也更符合现代前端的编码习惯。
你之前用猴子补丁缓存原始函数的方式虽然能临时解决问题,但属于workaround,用官方推荐的super写法才是长期稳定的正确姿势。
备注:内容来源于stack exchange,提问作者forvas
相关产品推荐
相关产品推荐

