フクロウコンポーネント¶
The Odoo Javascript framework uses a custom component framework called Owl. It is a declarative component system, loosely inspired by Vue and React. Components are defined using QWeb templates, enriched with some Owl specific directives. The official Owl documentation contains a complete reference and a tutorial.
重要
コードは web
モジュールにありますが、別の GitHub リポジトリからメンテナンスされています。 Owl への変更は、https://github.com/odoo/owl のプルリクエストで行う必要があります。
注釈
現在、すべてのOdooバージョン(バージョン14から)は、同じOwlバージョンを共有しています。
Owl コンポーネントの使用¶
Owl documentation はすでにOwl framework を詳細にドキュメントしているため、このページは Odoo 固有の情報のみを提供します。 まずは、Odoo で簡単な構成要素を作る方法を見てみましょう。
import { Component, xml, useState } from "@odoo/owl";
class MyComponent extends Component {
static template = xml`
<div t-on-click="increment">
<t t-esc="state.value">
</div>
`;
setup() {
this.state = useState({ value: 1 });
}
increment() {
this.state.value++;
}
}
この例では、Owl がグローバル名前空間のライブラリとして owl`として利用可能であることを示しています: Odoo のほとんどのライブラリと同じように単純に利用できます。 ここでテンプレートを静的なプロパティとして定義しましたが、`static
キーワードを使用しないでください。 一部のブラウザーでは使用できません(Odoo javascript コードは Ecmascript 2019 準拠している必要があります)。
ここでは、`xml`ヘルパーの助けを借りて、javascriptのコードでテンプレートを定義しますが、始めるのに便利です。 実際には、Odoo のテンプレートは xml ファイルで定義する必要があります。 その場合、コンポーネントはテンプレート名のみを定義する必要があります。
実際には、ほとんどのコンポーネントは 2 または 3 ファイルを同じ場所に定義する必要があります: javascript ファイル (my_component) です。 s
), テンプレートファイル (my_component.xml
) とオプションで scss (またはcss) ファイル (my_component. css
). これらのファイルは、いくつかのアセットバンドルに追加される必要があります。 Webフレームワークは、javascript/cssファイルのロードとテンプレートの読み込みを処理します。
上記のコンポーネントを定義する方法は次のとおりです:
import { Component, useState } from "@odoo/owl";
class MyComponent extends Component {
static template = 'myaddon.MyComponent';
...
}
そして、テンプレートは対応する xml ファイルにあります。
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t t-name="myaddon.MyComponent">
<div t-on-click="increment">
<t t-esc="state.value"/>
</div>
</t>
</templates>
注釈
テンプレート名は addon_name.ComponentName
の規約に従います。
関連項目
ベストプラクティス¶
最初に、コンポーネントはクラスなので、コンストラクタを持っています。しかし、コンストラクタはjavascriptでは特別なメソッドであり、決して上書きできません。 Odoo ではこれが時折便利なパターンなので、Odoo のコンポーネントが constructor メソッドを直接使用しないようにする必要があります。 代わりに、コンポーネントは setup
メソッドを使用します。
// correct:
class MyComponent extends Component {
setup() {
// initialize component here
}
}
// incorrect. Do not do that!
class IncorrectComponent extends Component {
constructor(parent, props) {
// initialize component here
}
}
もう一つの良い方法は、 addon_name.ComponentName
というテンプレート名に一貫した規則を使用することです。これにより、doo アドオン間の名前の衝突を防ぐことができます。
参照リスト¶
Odoo Web クライアントは Owl コンポーネントで構築されています。 簡単にするために、Odoo javascriptフレームワークは、いくつかの一般的な状況で再利用できる汎用コンポーネントのスイートを提供します。 例えばドロップダウンやチェックボックスやデータピッカーなどです このページでは、これらの汎用コンポーネントの使用方法を説明します。
技術名 |
簡単な説明 |
---|---|
スワイプ時の操作を行うスイパーコンポーネントです |
|
ラベルの付いた単純なチェックボックスコンポーネント |
|
から選択する色のリスト |
|
フル機能のドロップ |
|
タブを使用してページ間を移動するためのコンポーネント |
|
ペジネーションを処理する小さな構成要素です |
|
異なるオプションから選択するドロップダウンコンポーネント |
|
丸みを帯びたピルに表示されるタグのリスト |
ActionSwiper¶
ロケーション¶
@web/core/action_swiper/action_swiper
説明¶
これは、要素が水平方向にスワイプされたときにアクションを実行できるコンポーネントです。 スワイパーはアクションを追加するためにターゲット要素をラップしています。 ユーザーがその幅の一部を通過したスワイパーを解放すると、アクションが実行されます。
<ActionSwiper onLeftSwipe="Object" onRightSwipe="Object">
<SomeElement/>
</ActionSwiper>
コンポーネントを使用する最も簡単な方法は、上記のように xml テンプレート内でターゲット要素を直接使用することです。 しかし、時には、既存の要素を拡張し、テンプレートを複製したくない場合があります。
既存の要素の動作を拡張したい場合は、要素を直接ラップして内部に配置する必要があります。 また、要素がスワイプ可能な場合に管理する props を条件付きで追加することもできます。 アニメーションとスワイプする最小の部分が動作します
このコンポーネントを使用して、レコード、メッセージ、リスト内のアイテムなどと簡単にやり取りできます。

次の例では、基本的な ActionSwiper コンポーネントを作成します。ここでは、スワイプを両方向に有効にします。
<ActionSwiper
onRightSwipe="
{
action: '() => Delete item',
icon: 'fa-delete',
bgColor: 'bg-danger',
}"
onLeftSwipe="
{
action: '() => Star item',
icon: 'fa-star',
bgColor: 'bg-warning',
}"
>
<div>
Swipable item
</div>
</ActionSwiper>
注釈
右から左への言語(RTL)を使用する場合、アクションは固定されます。
props¶
名前(name) |
型 |
説明 |
---|---|---|
|
|
スワイプ中に翻訳効果が存在するかどうかを決定するオプションの boolean |
|
|
スワイプ終了後に使用されるオプションのアニメーション ( |
|
|
存在する場合、アクションスワイパーは左にスワイプすることができます |
|
|
現時点ではアクションスワイパーは右にスワイプできます |
|
|
アクションを実行するためにスワイプする必要があるオプションの最小幅比 |
onLeftSwipe
と onRightSwipe
プロパティの両方を同時に使用できます。
左右スワイプに使用される Object
には以下を含める必要があります:
action
は呼び出し可能な`Function` がコールバックとして機能します。スワイプが指定された方向に完了すると、そのアクションが実行されます。
bgColor
は背景色です。 bootstrapコンテキストカラー (danger
,info
,secondary
,success
,warning
)のいずれかになります。スワイパーの動作と視覚的な側面を定義するには、これらの値を指定する必要があります。
例: 既存のコンポーネントを拡張¶
次の例では、xpath
を使用して、ActionSwiper コンポーネント内の既存の要素をラップできます。 ここでは、メールで既読としてメッセージをマークするスワイパーが追加されました。
<xpath expr="//*[hasclass('o_Message')]" position="after">
<ActionSwiper
onRightSwipe="messaging.device.isMobile and messageView.message.isNeedaction ?
{
action: () => messageView.message.markAsRead(),
icon: 'fa-check-circle',
bgColor: 'bg-success',
} : undefined"
/>
</xpath>
<xpath expr="//ActionSwiper" position="inside">
<xpath expr="//*[hasclass('o_Message')]" position="move"/>
</xpath>
CheckBox¶
ロケーション¶
@web/core/checkbox/checkbox
説明¶
これは、その隣にラベルが付いた単純なチェックボックスコンポーネントです。 チェックボックスはラベルにリンクされています。チェックボックスは、ラベルがクリックされるたびに切り替えられます。
<CheckBox value="boolean" disabled="boolean" t-on-change="onValueChange">
Some Text
</CheckBox>
props¶
名前(name) |
型 |
説明 |
---|---|---|
|
|
true の場合チェックボックスがチェックされています。チェックされていない場合はチェックされていません |
|
|
trueの場合チェックボックスは無効になりますそうでなければ有効になります |
カラーリスト¶
ロケーション¶
@web/core/colorlist/colorlist
説明¶
ColorList では、定義済みリストから色を選択できます。 デフォルトでは、コンポーネントは現在選択されている色を表示し、canToggle
プロパティが存在するまで展開できません。 異なるプロパティは、その動作を変更したり、リストを常に展開したり、クリックされるとトグルとして動作させることができます。 を選択すると、選択されるまで使用可能な色のリストが表示されます。
props¶
名前(name) |
型 |
説明 |
---|---|---|
|
|
任意です。カラーリストがクリック時にリストを展開できるかどうか |
|
|
コンポーネントに表示する色のリスト。それぞれの色には固有の |
|
|
任意です。true の場合、リストは常に展開されます |
|
|
任意です。trueの場合、リストはデフォルトで展開されます |
|
|
色が選択されるとコールバックが実行されます |
|
|
任意です。選択されている色 |
id
の色 は次のとおりです。
Id |
色 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ドロップダウン¶
ロケーション¶
@web/core/dropdown/dropdown
と @web/core/dropdown/dropdown_item
説明¶
ドロップダウンでは、トグルがクリックされたときに項目のリストを表示することができます。 ドロップダウンアイテムと組み合わせることで、コールバックを呼び出し、項目が選択されたときにメニューを閉じることができます。
ドロップダウンは驚くほど複雑なコンポーネントで、彼らが提供する機能のリストは以下のとおりです。
クリック時にアイテムリストを切り替えます
外のクリックで閉じる
アイテムを選択したときに関数を呼び出します。
必要に応じてアイテムが選択されたときにアイテムリストを閉じます
SIY: 自分でスタイル
任意のレベルまでのサブドロップダウンをサポート
ドロップダウンを開く/閉じるか、ドロップダウンアイテムを選択する設定可能なホットキーです。
キーボードナビゲーション (矢印、タブ、Shift+タブ、ホーム、終了、入力とエスケープ)
ページがスクロールまたはサイズ変更されるたびに自分自身を再配置します
スマートに開くべき方向を選択しました(右から左への方向は自動的に処理されます)。
直接的な兄弟のドロップダウン: 1つが開いているとき、ほかの人をホバーで切り替えます
<Dropdown/>`コンポーネントを適切に使用するには、2つの`OWLスロット を追加する必要があります:
default
slot: ドロップダウンの toggle 要素が含まれています。 デフォルトでは、クリックイベントがこの要素に追加され、ドロップダウンを開いて閉じます。content
slot: ドロップダウンメニュー自体の 要素 を含み、ポップオーバーの中にレンダリングされます。 必須ではありませんが、いくつかの`DropdownItem`をこのスロットに入れることができます。これらのアイテムが選択されると、ドロップダウンは自動的に閉じます。
<Dropdown>
<!-- The content of the "default" slot is the component's toggle -->
<button class="my-btn" type="button">
Click me to toggle the dropdown menu!
</button>
<!-- The "content" slot is rendered inside the menu that pops up next to the toggle -->
<t t-set-slot="content">
<DropdownItem onSelected="selectItem1">Menu Item 1</DropdownItem>
<DropdownItem onSelected="selectItem2">Menu Item 2</DropdownItem>
</t>
</Dropdown>
ドロップ ダウン props¶
名前(name) |
型 |
説明 |
---|---|---|
|
|
ドロップダウンメニューに追加された任意のクラス名 |
|
|
オプションで、true の場合、ドロップダウンを無効にするため、ユーザーはそれをもう開くことができません。(デフォルト: |
|
|
ドロップダウンメニュー内のドロップダウンアイテムとして表示されるオプションのリスト |
|
|
必要に応じて、希望するメニューを開く位置を定義します。RTL方向が自動的に適用されます。有効な usePosition フック位置にする必要があります。(デフォルト: |
|
|
Optional関数は開く直前に呼び出されます。非同期かもしれません。 |
|
|
Optional関数は開いた直後に呼び出されます。 |
|
|
オープンまたはクローズ後に呼び出される任意の関数 (ドロップダウンがオープンかどうかを表す単一の引数としてブール値を与えます)。 |
|
|
|
|
|
オプションで、true の場合、ドロップダウンコンポーネントは、toggler に click イベントリスナーを追加しません。 ドロップダウンをいつ開くかを制御することができます。( |
|
|
必要に応じてドロップダウンのナビゲーションオプションを上書きします (`web/core/navigation/navigation`を参照してください)。 |
|
|
必要に応じて、true の場合、ドロップダウンのメニューを同じ位置に保持します。マウスがそれをホバリングしています。 メニューの内容が変更されたときにより良いUXを作成します。 |
|
|
オプションで、ドロップダウンメニューのrefを取得することができます (`useChildRef`から返される関数を期待します) |
DropdownItem props¶
名前(name) |
型 |
説明 |
---|---|---|
|
|
ルートスパンクラス名に追加された任意の値 (文字列と OWL classname オブジェクト記法 の両方をサポートしています)。 |
|
|
ドロップダウンアイテムが選択されたときに呼び出される任意の関数。 |
|
|
オプションで、アイテムが選択されたときにどの親ドロップダウンが閉じるかを制御します: |
|
|
ルート要素に追加された属性を表す任意のオブジェクト。 |
重要
コンポーネントにカスタム CSS を書くとき メニュー要素がトグルの隣ではなく、オーバーレイコンテナ内のドキュメントの下部にあることを忘れないでください。 ですから、menuClass
と class
プロパティを使って、セレクタをより簡単に書くことができます。(このDOMマジックでは、zインデックスの問題をたくさん回避できます。
入れ子になったドロップ¶
ドロップダウンは入れ子にすることができます。これを行うには、他のドロップダウンのコンテンツスロット内に新しいドロップダウンコンポーネントを置きます。 親ドロップダウンが開いている場合、子ドロップダウンはホバーで自動的に開きます。
デフォルトでは、DropdownItem を選択すると、ドロップダウンツリー全体が閉じられます。
Example
この例では、New サブ要素のサブメニューを使用して、ネストされた File ドロップダウン メニューを作成する方法を示します。
<Dropdown>
<button>File</button>
<t t-set-slot="content">
<DropdownItem onSelected="() => this.onItemSelected('file-save')">Save</DropdownItem>
<DropdownItem onSelected="() => this.onItemSelected('file-open')">Open</DropdownItem>
<Dropdown>
<button>New</button>
<t t-set-slot="content">
<DropdownItem onSelected="() => this.onItemSelected('file-new-document')">Document</DropdownItem>
<DropdownItem onSelected="() => this.onItemSelected('file-new-spreadsheet')">Spreadsheet</DropdownItem>
</t>
</Dropdown>
</t>
</Dropdown>
以下の例では、再帰的にテンプレートを呼び出し、ツリーのような構造を表示します。
<t t-name="addon.MainTemplate">
<div>
<t t-call="addon.RecursiveDropdown">
<t t-set="name" t-value="'Main Menu'" />
<t t-set="items" t-value="state.menuItems" />
</t>
</div>
</t>
<t t-name="addon.RecursiveDropdown">
<Dropdown>
<button t-esc="name"></button>
<t t-set-slot="content">
<t t-foreach="items" t-as="item" t-key="item.id">
<!-- If this item has no child: make it a <DropdownItem/> -->
<DropdownItem t-if="!item.childrenTree.length" onSelected="() => this.onItemSelected(item)" t-esc="item.name"/>
<!-- Else: recursively call the current dropdown template. -->
<t t-else="" t-call="addon.RecursiveDropdown">
<t t-set="name" t-value="item.name" />
<t t-set="items" t-value="item.childrenTree" />
</t>
</t>
</t>
</Dropdown>
</t>
制御されたドロップダウン¶
必要に応じて、コードを使用してドロップダウンを開いたり閉じたりすることもできます。 これを行うには、useDropdownState`フックと`state`プロパティを使用する必要があります。 `useDropdownState
は、`open`と`close`メソッド(と`isOpen`getter)を持つオブジェクトを返します。 オブジェクトをコントロールしたいドロップダウンの`state`プロパティに与え、それぞれの関数を呼び出すと、ドロップダウンが開いて閉じます。
デフォルトのクリックハンドラをトグルに追加したくない場合は、 manual
を true
に設定することもできます。
Example
次の例は、マウント時に自動的に開き、内部のボタンをクリックしたときにのみ閉じる確率が50%であることを示しています。
import { Component, onMounted } from "@odoo/owl";
import { Dropdown } from "@web/core/dropdown/dropdown";
import { DropdownItem } from "@web/core/dropdown/dropdown_item";
import { useDropdownState } from "@web/core/dropdown/dropdown_hooks";
class MyComponent extends Component {
static components = { Dropdown, DropdownItem };
static template = xml`
<Dropdown state="this.dropdown">
<div>My Dropdown</div>
<t t-set-slot="content">
<button t-on-click="() => this.mightClose()">Close It!<button>
</t>
</Dropdown>
`;
setup() {
this.dropdown = useDropdownState();
onMounted(() => {
this.dropdown.open();
});
}
mightClose() {
if (Math.random() > 0.5) {
this.dropdown.close();
}
}
}
DropdownGroup¶
場所: @web/core/dropdown/dropdown_group
DropdownGroupコンポーネントを使用してDropdownsが共通のグループを共有することができます。つまり、これらのドロップダウンのいずれかが開いている場合です。 クリックすることなく自動的にマウスホバーを開きます
これを行うには、すべてのDropdownsを単一のDropdownGroupで囲むか、同じ`group`キーでDropdownGroupsで囲みます。
Example
下記の例では、スニペットの下記のすべてのドロップダウンリストは同じグループを共有します:
<DropdownGroup>
<Dropdown>...</Dropdown>
<Dropdown>...</Dropdown>
<Dropdown>...</Dropdown>
</DropdownGroup>
次のスニペットでは、同じグループを共有するのは最初、2番目、4番目のドロップダウンのみです。
<DropdownGroup group="'my-group'">
<Dropdown>...</Dropdown>
<Dropdown>...</Dropdown>
</DropdownGroup>
<DropdownGroup group="'my-other-group'">
<Dropdown>...</Dropdown>
</DropdownGroup>
<DropdownGroup group="'my-group'">
<Dropdown>...</Dropdown>
</DropdownGroup>
メモ帳¶
ロケーション¶
@web/core/notebook/notebook
説明¶
メモ帳はタブ付きのインターフェイスに複数のページを表示するように作られています。 タブは、要素の上部に配置して水平に表示することも、左側に垂直レイアウトを表示することもできます。
`slot`を使用するか、専用の`props`を使用してインスタンス化する方法は2つあります。
isDisabled
属性でページを無効にすることができます。スロットノードに直接設定します。 またはページ宣言では、メモ帳が props として与えられた pages
で使用されている場合。 無効にすると、対応するタブも灰色表示になり、非アクティブになります。
props¶
名前(name) |
型 |
説明 |
---|---|---|
|
|
オプションを選択します。表示されないタブ内の要素へのアンカーナビゲーションを許可します。 |
|
|
任意です。クラス名はコンポーネントのルートに設定されます。 |
|
|
任意です。デフォルトで表示するページ「id」。 |
|
|
任意です。タブで使用されるアイコンの一覧です。 |
|
|
任意です。タブの方向が |
|
|
オプションです。ページが変更されるとコールバックが実行されます。 |
|
|
任意です。テンプレートから取り込むための |
Example
最初の方法は、コンポーネントのスロットにページを設定することです。
<Notebook orientation="'vertical'"> <t t-set-slot="page_1" title="'Page 1'" isVisible="true"> <h1>My First Page</h1> <p>It's time to build Owl components. Did you read the documentation?</p> </t> <t t-set-slot="page_2" title="'2nd page'" isVisible="true"> <p>Wise owl's silent flight. Through the moonlit forest deep, guides my path to code</p> </t> </Notebook>ページを定義するもう一つの方法はpropsを渡すことです。これは、同じ構造を共有しているページがある場合に便利です。 最初に、使用するページテンプレートごとにコンポーネントを作成します。
import { Component, xml } from "@odoo/owl"; import { Notebook } from "@web/core/notebook/notebook"; class MyTemplateComponent extends Component { static template = xml` <h1 t-esc="props.title" /> <p t-esc="props.text" /> `; } class MyComponent extends Component { static template = xml` <Notebook defaultPage="'page_2'" pages="pages" /> `; get pages() { return [ { Component: MyTemplateComponent, title: "Page 1", props: { title: "My First Page", text: "This page is not visible", }, }, { Component: MyTemplateComponent, id: "page_2", title: "Page 2", props: { title: "My second page", text: "You're at the right place!", }, }, ] } }
どちらの例もここに示されています:

ペガー¶
ロケーション¶
@web/core/pager/pager
説明¶
ページャーはページネーションを扱うための小さなコンポーネントです。ページは offset
と limit
(ページのサイズ) によって定義されます。 現在のページと total
要素数を表示します。たとえば、"9-12 / 20"です。 前の例では、`offset`は8、`limit`は4、`total`は20です。ページ間を移動するための2つのボタン("Previous"と"Next")があります。
注釈
ページャーはコントロールパネルでメインの使用以外の場所でも使用できます。 コントロールパネルのページャーを操作するには、 usePager フックを参照してください。
<Pager offset="0" limit="80" total="50" onUpdate="doSomething" />
props¶
名前(name) |
型 |
説明 |
---|---|---|
|
|
ページの最初の要素のインデックス。最初は 0 で始まりますが、ページャーは |
|
|
ページのサイズ。 |
|
|
ページがアクセスできる要素の合計数。 |
|
|
ページがページャによって変更されたときに呼び出される関数。 この関数は非同期であり、この関数が実行されている間はページャーを編集できません。 |
|
|
現在のページをクリックして編集することができます(デフォルトでは |
|
|
前のページのボタンにアクセスキー`p`を、次のページのボタンに`n`をバインドします(デフォルトは`true`)。 |
ロケーション¶
@web/core/select_menu/select_menu
説明¶
このコンポーネントは、ネイティブの select
要素を使用するよりも多くを行いたい場合に使用できます。 独自のオプションテンプレートを定義して、オプション間で検索したり、サブセクションでグループ化したりすることができます。
注釈
デフォルトのアクセシビリティ機能を提供し、モバイルデバイスでより優れたユーザーインターフェイスを持つため、ネイティブの HTML の select
要素を好みます。 このコンポーネントは、ネイティブ要素の制限を克服するために、より複雑なユースケースのために使用するように設計されています。
props¶
名前(name) |
型 |
説明 |
---|---|---|
|
|
任意です。ドロップダウンに表示する |
|
|
任意です。SelectMenuコンポーネントのルートにクラス名を設定します。 |
|
|
省略可能です。ドロップダウンに表示する |
|
|
任意です。複数選択を有効にします。複数選択が有効になっている場合、選択された値は SelectMenu 入力に :ref:`tag <frontend/tags_list>`s として表示されます。 |
|
|
任意です。切り替えボタンにクラス名を設定します。 |
|
|
オプション。選択した値を選択解除できるかどうか。 |
|
|
オプション。検索ボックスがドロップダウンに表示されているかどうか。 |
|
|
任意です。検索ボックスのプレースホルダとして表示されるテキスト。 |
|
|
任意です。現在選択されている値です。任意の種類の値を指定できます。 |
|
|
オプションです。オプションが選択されたときにコールバックが実行されます。 |
`選択`の形は以下のとおりです。
group
の形は次のとおりです。
choices
は、このグループに表示するchoice
のリストです。`label`はグループに関連付けられた表示テキストです。これはグループの上部に表示される`string`です。
Example
次の例では、SelectMenuには4つの選択肢が表示されます。 そのうちの1つはオプションの上に表示されます。グループが関連付けられていないためです。 しかし他のグループはグループのラベルで区切られています
import { Component, xml } from "@odoo/owl";
import { SelectMenu } from "@web/core/select_menu/select_menu";
class MyComponent extends Component {
static template = xml`
<SelectMenu
choices="choices"
groups="groups"
value="'value_2'"
/>
`;
get choices() {
return [
{
value: "value_1",
label: "First value"
}
]
}
get groups() {
return [
{
label: "Group A",
choices: [
{
value: "value_2",
label: "Second value"
},
{
value: "value_3",
label: "Third value"
}
]
},
{
label: "Group B",
choices: [
{
value: "value_4",
label: "Fourth value"
}
]
}
]
}
}
また、トグルの外観をカスタマイズし、適切なコンポーネント slot
を使用して、選択のためのカスタムテンプレートを設定することもできます。
<SelectMenu
choices="choices"
groups="groups"
value="'value_2'"
>
Make a choice!
<t t-set-slot="choice" t-slot-scope="choice">
<span class="coolClass" t-esc="'👉 ' + choice.data.label + ' 👈'" />
</t>
</SelectMenu>

SelectMenuが複数の選択で使用される場合、value
propsは選択した選択肢の値を含む`Array`でなければなりません。

もっと高度な使用例では、bottomArea
スロットを使ってドロップダウンの下部をカスタマイズできます。 ここでは、検索入力に対応する値が設定されたボタンを表示します。
<SelectMenu
choices="choices"
>
<span class="select_menu_test">Select something</span>
<t t-set-slot="bottomArea" t-slot-scope="select">
<div t-if="select.data.searchValue">
<button class="btn text-primary" t-on-click="() => this.onCreate(select.data.searchValue)">
Create this article "<i t-esc="select.data.searchValue" />"
</button>
</div>
</t>
</SelectMenu>

ロケーション¶
@web/core/tags_list/tags_list
説明¶
このコンポーネントは丸みを帯びたピルのタグのリストを表示できます。 これらのタグは、単にいくつかの値をリストすることができますか、またはアイテムの削除を可能にする編集可能です。 `itemsVisible`プロパティを使用すると、表示されるアイテムの数を制限することができます。 リストがこの制限よりも長い場合、追加項目の数は最後のタグの隣に円で表示されます。
props¶
名前(name) |
型 |
説明 |
---|---|---|
|
|
オプション。タグがバッジとして表示されるかどうか。 |
|
|
任意です。タグがテキストで表示されるかどうか。 |
|
|
任意です。リスト内の表示タグの制限。 |
|
|
コンポーネントに与えられた |
tag
の形は以下のとおりです。
colorIndex
は任意の色 id です。`icon`は、表示されるテキストの直前に表示されるオプションのアイコンです。
id
はタグの一意の識別子です。
img
は、表示されるテキストの直前に円形に表示される任意の画像です。
onClick
は、要素に与えることができる任意のコールバックです。 これにより、親要素はクリックされたタグに応じて任意の機能を扱うことができます。
onDelete
は、要素に与えることができる任意のコールバックです。 これにより、タグのリストからアイテムを削除できるようになり、親要素によって処理されなければなりません。
text
はタグに関連付けられているstring
です。
Example
次の例では、TagsList コンポーネントを使用して複数のタグを表示します。 開発者は、タグが押されたとき、または削除ボタンがクリックされたときに何が起こるかを親から処理します。
import { Component, xml } from "@odoo/owl";
import { TagsList } from "@web/core/tags_list/tags_list";
class Parent extends Component {
static template = xml`<TagsList tags="tags" />`;
static components = { TagsList };
setup() {
this.tags = [{
id: "tag1",
text: "Earth"
}, {
colorIndex: 1,
id: "tag2",
text: "Wind",
onDelete: () => {...}
}, {
colorIndex: 2,
id: "tag3",
text: "Fire",
onClick: () => {...},
onDelete: () => {...}
}];
}
}
各タグに与えられる属性によって、その外観と動作は異なります。
