如何在Odoo 16中使用JavaScript监听字段事件?(代码尝试后报错)
Odoo 16 自定义字段Widget监听按键事件报错排查与修复
报错原因分析
- 重复加载JS资源:同时在
manifest.py和assets.xml中配置加载同一份JS文件,导致脚本重复引入,引发变量冲突或加载异常。 - 正则表达式语法错误:
/[0-9C/F]/中的/是正则表达式的分隔符,未转义会被解析为正则结束标记,直接导致语法报错。 - 缺少Underscore依赖:代码使用
_.extend但未显式引入Underscore库,Odoo 16需手动声明该依赖。 - 事件绑定范围问题:直接绑定
keypress事件到Widget根节点,可能触发非输入框元素的事件,引发不必要的干扰。
修复方案
1. 清理重复的资源配置
删除views/assets.xml文件,或者注释掉其中添加JS脚本的代码,仅保留manifest.py中的assets配置即可,避免重复加载。
2. 修正JavaScript代码
odoo.define('circulacion.campo_nit', function (require) { "use strict"; var _ = require('web.utils'); var fieldRegistry = require('web.field_registry'); var FieldChar = require('web.basic_fields').InputField; var CampoNit = FieldChar.extend({ events: _.extend({}, FieldChar.prototype.events || {}, { 'keypress .o_input': '_onKeyPress', // 限定监听输入框元素,避免事件冒泡 }), _onKeyPress: function (event) { var input = String.fromCharCode(event.which); // 转义/,允许数字、C、F、斜杠 if (!/[0-9CF\/]/.test(input)) { event.preventDefault(); } }, }); fieldRegistry.add('campo_nit', CampoNit); return CampoNit; });
3. 调整manifest.py配置
"depends": ["base", "web"], # 新增web依赖,确保基础前端库加载完整 'assets': { 'web.assets_backend': [ 'circulacion/static/src/js/assets.js', ] }, "data": [ # "views/assets.xml", # 移除该行,避免重复加载 "security/ir.model.access.csv", "views/views.xml", "views/templates.xml", ],
4. 表单视图使用保持不变
<field name="nit" widget="campo_nit" />
内容的提问来源于stack exchange,提问作者CamposOtto
相关产品推荐
相关产品推荐

