Odoo 视图继承不是“把 XML 复制一份”:XPath、position 和 primary/extension 讲透
看懂 ir.ui.view 如何把继承链拼成最终 arch,为什么 XPath 找不到、position 失效,往往不是 Odoo 随机坏了。
TOPIC PICKS
看懂 ir.ui.view 如何把继承链拼成最终 arch,为什么 XPath 找不到、position 失效,往往不是 Odoo 随机坏了。
可以顺着继续读的相邻方向
很多人做字段二开时,关注点只停留在 widget 名称和组件模板,但 Odoo 真正复杂的是解析优先级:同一个字段会经过 registry 选型、supportedTypes 校验、extractProps、formatter/parser 乃至 view/jsClass 前缀回退。本文专门拆开这条“字段到底如何被解析成一个可运行 widget”的链路。
现成 UI 里按 ESC 关闭弹窗看起来天经地义,但 Odoo 的实现并不是谁监听到键盘就自己销毁。结合 dialog.js 与 dialog_service.js,本文专门讲透 ESC 从热键到 dismiss 再到 overlay remove 的所有权链路,以及多层弹窗为什么必须依赖 isActive。
Odoo 里的 hooks 看起来很轻,但真正的价值不是少写几行代码,而是把组件生命周期、环境注入和异步安全封成契约。结合 hooks.js 与 pager_hook.js,本文专门讲透 useService、useAutofocus、usePager 分别在保护什么,以及为什么它们不能简单当工具函数看待。
很多人会用 Odoo 的 patch(),但真正容易出事故的地方并不是语法,而是补丁边界:到底该 patch 类本身还是 prototype、getter/setter 只补一半会怎样、class method 的 enumerable 为什么要特殊处理。结合 patch.js 源码,本文专门拆开这些“看起来小、升级时最疼”的边界问题。
很多人觉得下拉菜单只是一个按钮加一个列表,但 Odoo `dropdown.js`、`dropdown_nesting.js` 和相关 hooks 说明,真正稳定的下拉系统必须同时处理嵌套层级、兄弟菜单互斥、键盘导航、RTL 行为、触屏 bottom sheet 和 click-away 边界。它本质上是一套微型运行时,而不是一个样式组件。
很多产品都做了命令面板,但真正难的不是做一个输入框,而是怎样把命令来源、分类、命名空间、上下文元素、热键和二级面板切换组织成统一运行时。Odoo 的 `command_service.js` 与 `command_palette.js` 说明,命令面板本质上是一套可扩展的命令汇聚与执行系统,而不是 UI 小组件。