Odoo 13/14如何检测当前是否打开弹窗并获取弹窗对应的model
检测Odoo 13/14弹窗状态并获取对应模型的方法
你需要识别的弹窗示例如下:
实现逻辑
Odoo 13、14的前端框架基于Backbone开发,所有打开的弹窗(Dialog/Modal)实例都会统一存储在全局web客户端的dialog_stack属性中,弹窗关联的业务模型信息会同步挂载在弹窗实例的对应属性下。
具体使用方法
1. 浏览器控制台调试代码
如果仅需要临时调试验证,直接在浏览器控制台执行以下代码即可:
// 获取所有已打开的弹窗实例列表 const openDialogs = odoo.__DEBUG__.services['web.web_client'].dialog_stack || []; // 判断是否存在打开的弹窗 const hasOpenedModal = openDialogs.length > 0; if (hasOpenedModal) { // 取最顶层的弹窗实例 const topModal = openDialogs[openDialogs.length - 1].dialog; // 提取弹窗关联的模型名称,覆盖原生弹窗、向导弹窗等多种场景 const relatedModel = topModal._openedView?.model || topModal.renderer?.state?.model || topModal.modelName; console.log('当前弹窗关联模型:', relatedModel); }
你截图中的res.partner表单弹窗执行上述代码后,会直接输出res.partner结果。
2. 自定义模块集成代码
如果需要在自研模块中集成该能力,可以参考以下写法封装工具方法:
odoo.define('your_custom_module.modal_utils', function (require) { "use strict"; const webClient = require('web.web_client'); // 工具方法:返回当前顶层弹窗关联模型,无弹窗返回false function getTopModalModel() { const dialogStack = webClient.dialog_stack || []; if (!dialogStack.length) { return false; } const topDialog = dialogStack[dialogStack.length - 1].dialog; return topDialog._openedView?.model || topDialog.renderer?.state?.model || topDialog.modelName; } // 可根据业务需要对外暴露方法 return { getTopModalModel: getTopModalModel }; });
注意事项
- 上述方法兼容Odoo 13、14两个版本的原生弹窗逻辑,如果你有高度自定义的非原生弹窗,需要根据自定义弹窗的实现逻辑调整模型取值属性
- 若需要监听弹窗打开事件主动获取模型,可以重写
web.Dialog的open方法,在弹窗打开触发时主动调用上述工具方法即可
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

