注册表

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

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

  • [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()) – 条目的键

返回

boolean

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

Registry.getAll()
返回

any[]

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

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

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

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

返回

Registry

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

参考列表

类别

内容

effects

所有可用效果的实现

formatters

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

main_components

顶层组件

parsers

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

services

所有应被激活的服务

systray

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

user_menuitems

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

效果注册表

effects 注册表包含所有可用效果的实现。详见 effect 服务 一节。

格式化器注册表

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

format(value[, options])
参数
  • value (T | false()) – 特定类型的值,若无给定值则为 false

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

返回

string

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

更多内容

主组件注册表

主组件注册表(main_components)用于在网页客户端中添加顶层组件。Webclient 有一个 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)是导航栏右侧的区域,包含各种小组件,它们通常显示某种信息(如未读消息数量)、通知,和/或让用户与之交互。

systray 注册表以对象的形式描述这些托盘项,对象包含以下三个键:

  • Component:表示该条目的组件类。其根元素应为 <li> 标签,否则样式可能不正确。

  • props(可选):应传递给组件的 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:(可选)如给定(且为真值),条目文本会放入一个带有给定 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),
    };
});