当前位置: 首页 > news >正文

【Odoo16前端源码分析】xml模板的加载

一、模板内容的来源

情况A,组件类的template属性,比如ActionContainer.template

/* odoo/addons/web/static/src/webclient/actions/action_container.js */export class ActionContainer extends Component {setup() {..}
}
..
ActionContainer.template = xml`<t t-name="web.ActionContainer"><div class="o_action_manager"><t t-if="info.Component" t-component="info.Component" className="'o_action'" t-props="info.componentProps" t-key="info.id"/></div></t>`;

情况B,组件类的同名xml文件,比如webclient.xml

<!-- /* odoo/addons/web/static/src/webclient/webclient.xml */ --><?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve"><t t-name="web.WebClient" owl="1"><t t-if="!state.fullscreen"><NavBar/></t><ActionContainer/><MainComponentsContainer/></t></templates>

二、存放模板内容的变量

情况A,存放在owl.js文件中的globalTemplates变量中

/* odoo/addons/web/static/lib/owl/owl.js */const globalTemplates = {};
function xml(...args) {const name = `__template__${xml.nextId++}`;const value = String.raw(...args);globalTemplates[name] = value;return name;
}
xml.nextId = 1;

情况B,通过app.addTemplates方法,将xml保存在TemplateSet的rawTemplates中,步骤如下

1 将各种xml文件打包到一个字符串templates中,然后调用loadXML方法处理templates

/* web.assets_backend.bundle.xml文件是由后台动态打包生成的 *//********************************************  Templates                               ********************************************/
odoo.define('web.assets_backend.bundle.xml', function(require) {'use strict';const {loadXML} = require('@web/core/assets');const templates = `<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
// xml文件的内容,做了省略处理
..
<t t-name="web.WebClient" owl="1"><t t-if="!state.fullscreen"><NavBar/></t><ActionContainer/><MainComponentsContainer/></t>
..
</templates>`;return loadXML(templates);
});

 2 设置app实例变量(注意:这里的app就是全局开始创建的唯一app实例)

/* odoo/addons/web/static/src/start.js */export async function startWebClient(Webclient) {..setLoadXmlDefaultApp(app);..
}

3 loadXML方法将templates中的xml文本,按照t-name属性提取出来,以key/value形式保存

/* odoo/addons/web/static/src/core/assets.js */let defaultApp;
/*** Loads the given xml template.** @param {string} xml the string defining the templates* @param {App} [app=defaultApp] optional owl App instance (default value*      can be changed with setLoadXmlDefaultApp method)* @returns {Promise<true>} resolved when the template xml has been loaded*/
export const _loadXML = (assets.loadXML = function loadXML(xml, app = defaultApp) {const doc = new DOMParser().parseFromString(xml, "text/xml");if (doc.querySelector("parsererror")) {throw doc.querySelector("parsererror div").textContent.split(":")[0];}for (const element of doc.querySelectorAll("templates > [t-name][owl]")) {element.removeAttribute("owl");const name = element.getAttribute("t-name");const previous = templates.querySelector(`[t-name="${name}"]`);if (previous) {console.debug("Override template: " + name);previous.replaceWith(element);} else {templates.documentElement.appendChild(element);}}if (app || defaultApp) {console.debug("Add templates in Owl app.");app.addTemplates(templates, app || defaultApp);} else {console.debug("Add templates on window Owl container.");}
});
/*** Update the default app to load templates.** @param {App} app owl App instance*/
export function setLoadXmlDefaultApp(app) {defaultApp = app;
}

三、将globalTemplates作为原型来创建this.rawTemplates属性,所以以后通过rawTemplates就能访问globalTemplates(前提是rawTemplates中没有要访问的属性时,才会访问globalTemplates,这是JS的原型链原理)

/* odoo/addons/web/static/lib/owl/owl.js */class TemplateSet {constructor(config = {}) {this.rawTemplates = Object.create(globalTemplates);this.templates = {};..if (config.templates) {this.addTemplates(config.templates);}}..
}

因为App继承TemplateSet,并且App没有定义rawTemplates属性,所以app.addTemplates操作的是TemplateSet的rawTemplates

四、后面其他功能通过app.rawTemplates获取需要的模板

http://www.lryc.cn/news/110304.html

相关文章:

  • Open3D (C++) 计算矩阵的广义逆
  • 11.物联网操作系统内存管理
  • 举办活动发布会,如何得到媒体支持?
  • 1139 First Contact(unique函数,string.substr()函数)
  • Python元编程-装饰器介绍、使用
  • python进程池的使用
  • Dockerfile构建lamp镜像
  • LeetCode724. 寻找数组的中心下标
  • 【云计算 | Docker】Docker容器后台运行不了?entrypoint在作妖?
  • DAY02_Spring第三方资源配置管理Spring容器Spring注解开发Spring整合Mybatis和Junit
  • 烘焙小程序蛋糕店烘焙店源码点心店小程序源码
  • HarmonyOS 开发基础(五)对用户名做点啥
  • 【前端】搭建Vue3框架
  • Opencv-C++笔记 (15) : 像素重映射 与 图像扭曲
  • 【Java】UWB高精度工业人员安全定位系统源码
  • 文本NLP噪音预处理(加拼写检查)
  • [Docker实现测试部署CI/CD----自由风格的CI操作[最终架构](5)]
  • 纯JS+Vue实现一个仪表盘
  • 标定(内参、外参)
  • 基于ffmpeg与SDL的视频播放库
  • 基于二进制草蝉优化算法选择特征并使用 KNN 进行训练(Matlab代码实现)
  • 14-4_Qt 5.9 C++开发指南_QUdpSocket实现 UDP 通信_UDP组播
  • ai图片合成软件帮你创造个性绚丽
  • git 版本回退
  • 使用Jackson自定义序列化操作(Jackson – Custom Serializer)
  • Python-元组
  • 快速转换PDF文件: Python和PyMuPDF教程
  • 规划模型Matlab代码
  • 用html+javascript打造公文一键排版系统11:改进单一附件说明排版
  • snap xxx has “install-snap“ change in progress