ODOO14中JavaScript函数如何获取当前调用的模型与记录id?
实现方案
你拿不到参数的核心问题有两个:一是Promise内部this指向偏移,没有指向正确的视图上下文;二是从按钮元素的dataset拿模型是错误的,除非你主动在按钮XML上定义了对应data属性,否则该属性不存在。
推荐实现方式(从视图实例取值,稳定性最高)
Odoo的表单/列表视图控制器实例本身就自带当前上下文的模型、记录ID属性,直接读取即可,不需要解析URL:
// 外层提前存储正确的视图上下文,避免Promise内部this指向错误 const self = this; const def = new Promise(function (resolve, reject) { // 读取当前模型名 const currentModel = self.modelName; // 读取当前表单视图的单条记录ID const currentRecordId = self.res_id; // 列表视图选中多条的场景可以用下面的方法拿选中ID数组 // const selectedIds = self.getSelectedIds(); const call_kw = '/web/dataset/call_kw/my.module/my_func'; session.rpc(call_kw, { model: 'my.module', method: 'my_func', // 将模型、ID作为参数传给后端方法 args: [currentModel, currentRecordId], kwargs: {} }).then(result => resolve(result)) .catch(error => reject(error)); });
备选实现方式(解析URL Hash参数)
如果确实需要从URL取值,可以用下面的方法读取Hash中的参数,和你给出的示例URL匹配:
// 封装Hash参数读取方法 function getHashParam(paramName) { const hashParams = new URLSearchParams(window.location.hash.slice(1)); return hashParams.get(paramName); } // 调用取值 const currentModel = getHashParam('model'); const currentRecordId = getHashParam('id');
注意事项
- 该方案适用于Odoo 12及以上版本的视图控制器扩展场景
- 如果是自定义注入的按钮,需要确保你的JS绑定方法的上下文是当前视图的控制器实例,才能正常读取
modelName、res_id属性
内容的提问来源于stack exchange,提问作者Faheem
相关产品推荐
相关产品推荐

