登记处

注册表是(有序的)键/值映射。它们是主要的 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()) – 如果 key 已经存在则不要抛出

  • [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

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

user_menuitems

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

效果注册表

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

格式化程序注册表

formatters 注册表包含格式化值的函数。每个格式化程序都有以下 API:

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 注册表包含解析值的函数。每个解析器都有以下 API:

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

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

返回

T 有效值

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

其他资料

服务注册中心

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

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):应该给予组件的道具

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