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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:17:59