第八章 环境变量

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的启动过程便使用了该方法进行服务启动。

总结

关于环境变量的内容并不是很长,因为环境变量其本身的逻辑并不复杂,只是它的作用很重要,我们只有理解了它的作用,在阅读其他代码的时候才不会迷茫。

results matching ""

    No results matching ""