Registries注册表

注册表是(有序的)键/值映射。它们是 Web 客户端的主要扩展点:Odoo JavaScript 框架提供的许多功能在需要某些对象(例如字段、视图、客户端操作或服务)的定义时,都会查找注册表。通过在正确的注册表中添加特定值,即可轻松定制 Web 客户端。

import { Registry } from "@web/core/registry";

const myRegistry = new Registry();

myRegistry.add("hello", "odoo");

console.log(myRegistry.get("hello"));

注册表的一个有用特性是它们维护了一组子注册表,这些子注册表通过 category 方法获取。如果子注册表尚不存在,则会动态创建。Web 客户端使用的所有注册表都以这种方式从一个根注册表中获取,该根注册表导出在 @web/core/registry 中。

import { registry } from "@web/core/registry";

const fieldRegistry = registry.category("fields");
const serviceRegistry = registry.category("services");
const viewRegistry = registry.category("views");

注册表 API

class Registry()

创建一个新的注册表。请注意,注册表是一个事件总线,因此可以监听 UPDATE 事件(如果需要)。注册表是有序的:getAll 方法会根据序列号返回一个有序的值列表。

Registry.add(key, value[, options])
参数
  • key (string()) – 新条目的键

  • value (any()) – 新条目的值

  • options (Object()) – 选项

  • [options.force] (boolean()) – 如果键已存在,则不抛出错误

  • [options.sequence] (number()) – 序列号(用于对条目排序)

返回

注册表

在指定键处插入一个值。如果键已被使用,此方法将抛出错误(除非将选项 force 设置为 true)。选项 sequence 可用于在特定位置插入值。此方法还会触发 UPDATE 事件。

返回同一个注册表,因此可以链式调用 add 方法。

Registry.get(key[, defaultValue])
参数
  • key (string()) – 条目的键

  • any (defaultValue()) – 如果键不存在,则返回默认值

返回与 key 参数对应的值。如果注册表不包含该键,则返回 defaultValue (如果提供),否则抛出错误。

Registry.contains(key)
参数
  • key (string()) – 条目的键

返回

布尔值

如果 key 存在于注册表中,则返回 true

Registry.getAll()
返回

任意数组

返回注册表中所有元素的列表。该列表根据序列号排序。

Registry.remove(key)
参数
  • key (string()) – 应移除的条目的键

从注册表中移除一个键/值对。此操作会触发 UPDATE 事件。

Registry.category(subcategory)
参数
  • subcategory (string()) – 子类别的名称

返回

注册表

返回与 subcategory 关联的子注册表。如果它尚不存在,则会动态创建子注册表。

参考列表

类别

内容

效果

所有可用效果的实现

格式化器

用于格式化值的工具函数(主要用于字段值)

主组件

顶层组件

解析器

用于解析值的工具函数(主要用于字段值)

服务

所有应激活的服务

系统托盘

显示在导航栏系统托盘区域的组件

用户菜单项

显示在用户菜单中的菜单项(导航栏右上角)

效果注册表

effects 注册表包含所有可用效果的实现。更多详细信息,请参阅 效果服务 部分。

格式化器注册表

formatters 注册表包含用于格式化值的函数。每个格式化器具有以下 API:

format(value[, options])
参数
  • value (T | false()) – 特定类型的值,如果没有提供值则为 false

  • options (Object()) – 各种选项

返回

字符串

格式化一个值并返回一个字符串

主组件注册表

主组件注册表(main_components)可用于在 Web 客户端中添加顶层组件。Web 客户端有一个 MainComponentsContainer 作为直接子组件。该组件基本上是主组件注册表中注册的有序组件列表的实时表示。

API
interface {
    Component: Owl Component class
    props?: any
}

例如,可以像这样将 LoadingIndicator 组件添加到注册表中:

registry.category("main_components").add("LoadingIndicator", {
  Component: LoadingIndicator,
});

解析器注册表

parsers 注册表包含用于解析值的函数。每个解析器具有以下 API:

parse(value[, options])
参数
  • value (string()) – 表示值的字符串

  • options (Object()) – 各种选项(解析器特定)

返回

T 表示有效值

解析字符串并返回一个值。如果字符串不代表有效值,解析器可能会失败并抛出错误。

服务注册表

服务注册表(类别:services)包含所有应由 Odoo 框架激活的 服务

import { registry } from "@web/core/registry";

const myService = {
    dependencies: [...],
    start(env, deps) {
        // some code here
    }
};

registry.category("services").add("myService", myService);

系统托盘注册表

系统托盘是导航栏右侧的区域,包含各种小型组件,通常显示某些信息(例如未读消息的数量)、通知和/或允许用户与其交互。

systray 注册表包含这些系统托盘项的描述,作为具有以下三个键的对象:

  • Component:表示该项的组件类。其根元素应为 <li> 标签,否则可能无法正确设置样式。

  • props(可选):应传递给组件的 props

  • isDisplayed(可选):一个接受 env 并返回布尔值的函数。如果为真,则显示系统托盘项;否则将其移除。

例如:

import { registry } from "@web/core/registry";

class MySystrayItem extends Component {
    // some component ...
}

registry.category("systray").add("myAddon.myItem", {
    Component: MySystrayItem,
});

系统托盘注册表是一个有序注册表(通过 sequence 数字排序):

const item = {
    Component: MySystrayItem
};
registry.category("systray").add("myaddon.some_description", item, { sequence: 43 });

序列号默认为 50。如果提供,该数字将用于对项目进行排序。在系统托盘菜单中,最低序列号位于右侧,最高序列号位于左侧。

用户菜单注册表

用户菜单注册表(类别:user_menuitems)包含打开用户菜单时显示的所有菜单项(导航栏右上角带有用户名的部分)。

用户菜单项由一个接受 env 并返回普通对象的函数定义,该对象包含以下信息:

  • description:菜单项文本,

  • href:(可选)如果提供(且为真值),则将项文本放入带有指定 href 属性的 a 标签中,

  • callback:当选中该项时调用的回调函数,

  • hide:(可选)指示是否隐藏该项(默认值:false),

  • sequence:(可选)确定该项在其他下拉项中的顺序(默认值:100)。

每次打开用户菜单时,都会调用所有定义项的函数。

示例:

import { registry } from "@web/core/registry";

registry.category("user_menuitems").add("my item", (env) => {
    return {
        description: env._t("Technical Settings"),
        callback: () => { env.services.action_manager.doAction(3); },
        hide: (Math.random() < 0.5),
    };
});