注册表

注册表是(有序的)键/值映射。它们是 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 事件。注册表是有序的::js getAll 方法返回按序号排序的值列表。

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

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

  • options (Object()) – 选项

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

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

退货

Registry

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

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

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

  • any (defaultValue()) – 如果键没有对应条目时返回的值

返回与 key 参数对应的值。如果注册表不包含该键,则此方法在提供了 defaultValue 时返回它,否则抛出错误。

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

退货

布尔值

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

Registry.getAll()
退货

any[]

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

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

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

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

退货

Registry

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

参考列表

类别

内容

效果

所有可用效果的实现

格式化器

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

主组件

顶层组件

解析器

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

服务

所有应被激活的服务

系统托盘

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

用户菜单项

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

效果注册表

effects 注册表包含所有可用效果的实现。更多细节请参阅 效果服务 一节。

格式化器注册表

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

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

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

退货

string

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

更多内容

主组件注册表

主组件注册表(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 (optional):应传递给组件的 props

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

例如:

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