You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:54:00