第八章 环境变量
OWL中的环境变量封装了几个核心的功能,以供组件使用。
环境变量的核心功能
export function makeEnv() {
return {
qweb: new owl.QWeb(),
bus: new owl.core.EventBus(),
services: {},
debug: odoo.debug,
_t: () => {
throw new Error("Translations are not ready yet. Maybe use _lt instead?");
},
get isSmall() {
throw new Error("UI service not initialized!");
},
};
}
环境变量不是一个单独的对象,它本质上是一个封装了几个内置对象的字典。其内部的主要组成部分有如下几个:
- qweb: qweb组件
- bus: 事件总线组件
- services: 所有已组册的服务字典
- debug: 是否调试模式
环境变量的加载
环境变量对外提供服务,是通过makeEnv方法返回一个环境变量的字典而完成的。
我们之前在WebClient部分提到,系统通过startWebClient方法启动WebClient的初始化,而环境变量在WebClient启动的时候也进行了初始化,并将其包含的所以已注册的服务进行启动。
// setup environment
const env = makeEnv();
const [, templates] = await Promise.all([
startServices(env),
odoo.loadTemplatesPromise.then(processTemplates),
]);
env.qweb.addTemplates(templates);
...
const root = await mount(Webclient, { env, target: document.body, position: "self" });
因此,我们在WebClient中可以直接使用如下的方式使用已经注册的服务:
this.env.service.rpc(...);
startServices
与环境变量一同定义的还有一个startServices方法,该方法的作用是启动注册中心所有已经注册的服务,并保证每个服务的依赖已经正确的加载。
WebClient的启动过程便使用了该方法进行服务启动。
总结
关于环境变量的内容并不是很长,因为环境变量其本身的逻辑并不复杂,只是它的作用很重要,我们只有理解了它的作用,在阅读其他代码的时候才不会迷茫。