注册表

注册表是(有序的)键/值映射。它们是网页客户端的主要扩展点: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()) – key for the new entry

  • value (any()) – value for the new entry

  • options (Object()) – options

  • [options.force] (boolean()) – do not throw if key already exists

  • [options.sequence] (number()) – sequence number (useful to order entries)

返回

Registry

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

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

Registry.get(key[, defaultValue])
参数
  • key (string()) – key for the entry

  • any (defaultValue()) – return value if no entry for key exists

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

Registry.contains(key)
参数
  • key (string()) – key for the entry

返回

布尔值

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

Registry.getAll()
返回

any[]

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

Registry.remove(key)
参数
  • key (string()) – the key for the entry that should be removed

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

Registry.category(subcategory)
参数
  • subcategory (string()) – the name for the sub category

返回

Registry

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

参考列表

类别

内容

效果

所有可用效果的实现

格式化器

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

主组件

顶层组件

解析器

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

服务

所有应被激活的服务

系统托盘

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

用户菜单项

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

效果注册表

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

格式化器注册表

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

format(value[, options])
参数
  • value (T | false()) – a value of a specific type, or false if no value is given

  • options (Object()) – various options

返回

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()) – a string representing a value

  • options (Object()) – various options (parser specific)

返回

T a valid value

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

更多内容

服务注册表

服务注册表(类别: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),
    };
});