如何通过Odoo JS API获取当前视图模型(系统托盘组件场景)
获取Odoo当前视图对应模型的规范方法
嘿,这个场景我太熟悉了!在Odoo开发中,确实没必要去解析URL来获取当前模型——官方JS API提供了更规范、更可靠的方式,完全符合Odoo的架构逻辑。
核心思路:利用Odoo的action_manager服务
Odoo的界面状态由action_manager统一管理,它能直接提供当前活跃的视图控制器(Controller)或Action信息,从中就能轻松拿到对应的模型名称。
具体实现代码
你可以直接在on_click方法里调用action_manager服务的API,修改后的完整代码如下:
odoo.define('xx.systray', function (require) { "use strict"; var config = require('web.config'); var SystrayMenu = require('web.SystrayMenu'); var Widget = require('web.Widget'); var ajax = require('web.ajax'); var xxMenu = Widget.extend({ template:'solvo-support.helpMenu', events: { "click": "on_click", }, on_click: function () { // 方式1:获取当前控制器,直接拿到模型名称(推荐) const currentController = this.call('action_manager', 'getCurrentController'); if (currentController) { const currentModel = currentController.modelName; console.log('当前视图模型:', currentModel); // 你的业务逻辑:比如判断是否是报价单模型 if (currentModel === 'sale.order') { // 这里执行新建报价单相关的操作 console.log('用户当前在报价单视图'); } } else { console.log('未加载任何活跃视图(比如在首页)'); } // 方式2:获取当前Action,从Action定义中拿模型 // const currentAction = this.call('action_manager', 'getCurrentAction'); // if (currentAction) { // const currentModel = currentAction.res_model; // console.log('当前Action对应的模型:', currentModel); // } }, }); SystrayMenu.Items.push(xxMenu); });
两种方法的区别
- 方式1(获取Controller):直接拿到当前正在显示的视图控制器,
modelName就是视图绑定的模型,准确性更高,推荐使用。 - 方式2(获取Action):拿到的是当前执行的Action定义,
res_model字段对应模型,适合需要Action其他信息(比如视图类型、参数)的场景。
为什么这比解析URL好?
- 避免URL路由变化导致的解析错误(Odoo版本升级可能调整URL结构);
- 完全遵循Odoo的官方API规范,代码更易维护;
- 能处理更多边缘场景(比如首页、未加载视图的情况)。
内容的提问来源于stack exchange,提问作者Mariano DAngelo
相关产品推荐
相关产品推荐

