注冊表?

注冊表是(有序的)鍵/值映射。它們是Odoo JavaScript框架提供的許多功能的主要Web客戶端擴展點:每當它需要某個對象(例如字段、視圖、客戶端操作或服務)的定義時,它就會簡單地查找注冊表。然后,通過在正確的注冊表中添加特定值來定制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()) – 序列號(有助于排序條目)

返回

注冊表

在特定的鍵上插入一個值。如果該鍵已經被使用,此方法會拋出一個錯誤(除非選項 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()) – 子類別的名稱

返回

注冊表

返回與 subcategory 相關聯的子注冊表。如果尚不存在,則會動態創建子注冊表。

參考列表?

分類

內容

效果

所有可用效果的實現

格式化程序

格式化值的實用函數(主要用于字段值)

main_components

頂級組件

解析器

用于解析值的實用函數(主要用于字段值)

服務

應該被激活的所有服務

系統托盤

在導航欄中顯示在系統托盤區域的組件

user_menuitems

在用戶菜單中顯示的菜單項(位于導航欄的右上角)

特效注冊表?

effects 注冊表包含所有可用效果的實現。有關更多詳細信息,請參見 effect service 部分。

格式化程序注冊表?

formatters 注冊表包含格式化值的函數。每個格式化器都有以下 API:

format(value[, options])?
參數
  • value (T | false()) – 一個特定類型的值,如果沒有給出值則為 false

  • options (Object()) – 各種選項

返回

字符串

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

另請參閱

主要組件注冊表?

主組件注冊表( 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()) – 各種選項(特定于解析器)

返回

請輸入有效值

解析字符串并返回一個值。如果字符串不表示有效的值,則解析器可能會失敗并拋出錯誤。

服務注冊表?

服務注冊表(類別: 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,
});

系統托盤注冊表是一個有序注冊表(帶有“序列”號碼):

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