如何在Odoo 15中覆写core.action_registry中的JS函数update_attendance
问题:覆写Odoo hr_attendance模块的update_attendance函数无效
hr_attendance模块在core.action_registry中注册了抽象动作hr_attendance_my_attendances,其中包含update_attendance函数,尝试覆写该函数但未生效。参考示例时发现core.action_registry没有extend方法,当前模块的my_attendances.js代码如下:
odoo.define('my_module.my_attendances', function (require) { "use strict"; const session = require('web.session'); var core = require('web.core'); var MyAttendances = require('hr_attendance.my_attendances'); var MyAttendancesExtended = MyAttendances.extend({ // events: _.extend({ // 'click .o_hr_attendance_sign_in_out_icon': 'update_attendance', // }, AbstractField.prototype.events), update_attendance: function () { console.log('I HAVE OVERWRITTEN THE FUNCTION'); var self = this; this._rpc({ model: 'hr.employee', method: 'attendance_manual', args: [[self.employee.id], 'hr_attendance.hr_attendance_action_my_attendances', None], context: session.user_context, }) .then(function(result) { if (result.action) { self.do_action(result.action); } else if (result.warning) { self.displayNotification({ title: result.warning, type: 'danger' }); } }); }, }); core.action_registry.add('my_module.my_attendances', MyAttendancesExtended); return MyAttendancesExtended; });
已将JS文件添加至__manifest__.py,但控制台看不到日志输出:
'assets': { 'web.assets_backend': [ 'my_module/static/src/js/my_attendance.js', ], },
解决思路
替换原有动作注册项:当前代码是新增了一个自定义动作,但系统实际调用的还是原有的
hr_attendance.my_attendances动作。需要先移除原动作的注册,再将扩展后的类重新注册到同一个动作名上:// 替换原有的动作注册代码 core.action_registry.remove('hr_attendance.my_attendances'); core.action_registry.add('hr_attendance.my_attendances', MyAttendancesExtended);修正JS文件名不一致问题:
__manifest__.py中配置的文件名是my_attendance.js,但实际代码文件是my_attendances.js(多了一个s),这会导致文件无法加载,修正路径为:'assets': { 'web.assets_backend': [ 'my_module/static/src/js/my_attendances.js', ], },修复JS语法错误:JavaScript中没有
None关键字,需要替换为null,否则会导致函数执行报错:args: [[self.employee.id], 'hr_attendance.hr_attendance_action_my_attendances', null],确保加载Underscore(可选):如果需要扩展事件,要确保引入Underscore工具库,在代码顶部添加:
var _ = require('web.utils')._;若只是覆写方法,无需重写
events,原类的事件绑定会自动继承。清除缓存并更新模块:修改静态资源后,需强制刷新浏览器缓存(Ctrl+Shift+R),同时重启Odoo服务并更新模块(执行
./odoo-bin -u my_module),确保新代码生效。
内容的提问来源于stack exchange,提问作者forvas
相关产品推荐
相关产品推荐

