その通りです。2つの方法があります。
-
カスタマイズをウィジェットにし、次のようにプラグインのアウトレットにウィジェットをマウントします。
{{mount-widget widget="widget-name"}}Discourse でウィジェットがどのように作成されるかの例(たとえば、ホームロゴ)は、discourse/app/assets/javascripts/discourse/app/widgets/home-logo.js at 2dbcea9eeeb816dda347027497b3a49634ef851f · discourse/discourse · GitHub で確認できます。
テーマでは、
widget-name.jsファイルをjavascripts/discourse/widgetsディレクトリに追加します。ウィジェットに関する詳細は、A tour of how the Widget (Virtual DOM) code in Discourse works にありますが、ウィジェットは徐々に廃止される予定であるため、このプロセスで学んだことは長期的には役に立たないことに注意してください。
-
ウィジェットデコレーターはそのままにして、プラグインのアウトレットで目的の操作を行う別の Ember コンポーネントを作成します。ウィジェットは、Discourse の大部分が構築されている Ember コンポーネントに置き換える形で廃止を進めています。
このプロセスは次のようになります。
-
テーマの
javascripts/discourse/componentsディレクトリにコンポーネントの JS ファイルと HBS ファイルを作成します。-
component-name.js -
component-name.hbs
-
-
Ember コンポーネントをビルドします。残念ながら、このステップは基本的に「Ember を学ぶ」ことです (Ember Guides)。ただし、これは開始の目安になると思います。
component-name.jsで:
import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; import { action } from "@ember/object'; const endpoint = settings.site_navigation_links_endpoint; export default class ComponentName extends Component { @tracked navLinks = null; @action async fetchNavLinks() { try { const response = await fetch(endpoint); const data = await response.json(); // これが JSON であると仮定します this.navLinks = data; } catch (error) { console.error("Failed:", error); } } }component-name.hbsで:
<div {{did-insert this.fetchNavLinks}}> {{#each this.navLinks as |link|}} <a href={{link.anchor}}>{{link.title}}</a> {{/each}} </div>これにより、コンポーネントが挿入されたとき(この場合は、Discourse サイトにアクセスしてアプリがレンダリングされたとき)に
fetchNavLinksアクションが呼び出されます。navLinksが更新されるたびに、それが追跡対象のプロパティであるため、コンポーネントの内容も更新されます。コンポーネントのレンダリング時よりも頻繁にリンクを更新したい場合は、ここでの JS に追加のロジックを組み込む必要があります。たとえば、現在のルート(ページ)が特定の条件を満たしているかどうかを確認します。
-
このコンポーネントは、
javascripts/discourse/connectors/below-site-header/my-component-connector.hbsでアウトレットに追加することで、プラグインアウトレットに追加されます。<ComponentName />
-