注册表

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

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

const myRegistry = new Registry();

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

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

注册表的一个有用特性是,它们维护一组子注册表,这些子注册表通过 category 方法获取。如果子注册表尚不存在,它会即时创建。所有由网页客户端使用的注册表都是通过这种方式从一个根注册表中获取的,并在 @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,此方法将返回 defaultValue,否则会抛出错误。

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

返回

布尔值

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

Registry.getAll()
返回

任何[]

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

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

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

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

返回

注册表

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

参考列表

类别

内容

效果

所有可用效果的实现

格式化器

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

主要组件

顶级组件

解析器

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

服务

所有应激活的服务

系统托盘

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

用户菜单项

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

效果注册表

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

格式化程序注册表

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

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

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

返回

字符串

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

另请参见

主组件注册表

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

接口
interface {
    Component: Owl Component class
    props?: any
}

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

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

解析器注册表

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

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 (可选): 应传递给组件的属性

  • isDisplayed (可选): 一个函数,接收 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 : (可选) 如果提供(且为真值),则将条目文本放入带有给定属性 hrefa 标签中,

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