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

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

main_components

顶层组件

解析器parsers

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

服务services

所有应激活的服务

系统托盘systray

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

用户菜单项ser_menuitems

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

效果注册表

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),
    };
});