Odoo 16中如何在action_service.js中补丁/引入自定义代码
Odoo 16 自定义report_type不生效+JS补丁报错解决指南
问题背景
- 基于Odoo 16开发,自定义的
action.report_type未被系统识别,需扩展_executeReportAction函数添加适配逻辑 - 已创建自定义模块,JS文件放置路径为
mycustom_module/static/src/js,但使用patch/include方法均无效果,代码中console语句无输出 - 偶发报错:
Error while loading mycustom_module.Receipt: WeakMap key must be an object, got obj TypeError: WeakMap key must be an object, got obj - 尝试
ActionService.include方法仍触发错误
解决步骤
1. 确认前端资源注册正确
在模块的__manifest__.py中,确保JS文件已被添加到对应资产包:
'assets': { 'web.assets_backend': [ 'mycustom_module/static/src/js/*.js', ], },
若为POS场景,需替换为point_of_sale.assets资产包。
2. 修正补丁写法(解决WeakMap错误)
Odoo 16优先使用patch方法,include已逐步废弃。错误根源是补丁目标对象传入错误,正确写法如下:
import { patch } from '@web/core/utils/patch'; import { ActionService } from '@web/webclient/actions/action_service'; patch(ActionService.prototype, 'mycustom_module.patch_action_service', { async _executeReportAction(action, options) { // 保留原方法逻辑(可选) const originalResult = await this._super(...arguments); // 处理自定义report_type if (action.report_type === 'your_custom_type') { console.log('自定义报表类型触发'); // 此处添加你的自定义处理逻辑 } return originalResult; }, });
核心注意:必须针对类的原型对象(ActionService.prototype)进行patch,而非类本身。
3. 强制刷新资源与缓存
修改JS后必须执行以下操作:
- 强制刷新浏览器缓存(Ctrl+Shift+R)
- 重启Odoo服务
- 执行命令强制更新资产:
./odoo-bin -u mycustom_module --force-assets
4. 检查模块依赖配置
确保__manifest__.py中添加了必要依赖:
'depends': ['web'],
若为POS模块,需添加point_of_sale依赖。
5. 调试验证
- 在JS文件开头添加
console.log('自定义JS已加载');,确认文件是否被正确加载 - 使用浏览器开发者工具的Sources面板,定位到你的JS文件,设置断点验证逻辑是否执行
内容的提问来源于stack exchange,提问作者Amit Sinha
相关产品推荐
相关产品推荐

