1つのページにのみHTMLをインジェクト

テーマの JS タブに以下のようなコードがあります:

import { apiInitializer } from "discourse/lib/api";


export default apiInitializer("0.11.1", (api) => { 
    api.renderInOutlet("above-main-container",
        <template>
            <div>
              html stuff
            </div>
        </template>
     );
});

これをコピー&ペーストしましたが、動作します(例です)。

これをホームページのみ、またはカテゴリーページのみでレンダリングするにはどうすればよいでしょうか。

質問が不適切であれば申し訳ありません。

それは良い質問です。心配しないでください!これで動作します:

import Component from "@glimmer/component";
import { service } from "@ember/service";
import { apiInitializer } from "discourse/lib/api";
import { defaultHomepage } from "discourse/lib/utilities";

class HomepageOnly extends Component {
  @service router;

  get shouldShow() {
    return this.router.currentRouteName === `discovery.${defaultHomepage()}`;
  }

  <template>
    {{#if this.shouldShow}}
      <div>
        html stuff
      </div>
    {{/if}}
  </template>
}

export default apiInitializer((api) => {
  api.renderInOutlet("above-main-container", HomepageOnly);
});

これにより、router サービスと defaultHomepage ユーティリティを使用してホームページにいるかどうかをチェックする新しいコンポーネントが作成されます。その後、そのコンポーネントがアウトレットにレンダリングされます。

さらに詳細な情報は、こちらを参照してください:Add custom content that only appears on your homepage

Krisさん、ありがとうございます。完璧に動作しました。リンクもありがとうございます。勉強中です。

続きの質問があります

注入した小さな HTML チャンクがホームページに素敵なバナーを表示し、正常に読み込まれて動作しています。テーマの <head> タブに以下を配置しました:

document.addEventListener('DOMContentLoaded', loadMyWidget);

動作はしますが、他のページに移動してからホームページに戻ると、ウィジェットが再度読み込まれません。以下を追加してみましたが:

window.addEventListener('focus', loadMyWidget);

改善されませんでした。誰か助けてください。この質問のために新しいトピックを立てるべきでしょうか?

追記:

自分で解決策を見つけました。

export default apiInitializer((api) => { に以下を追加しました:

api.onPageChange(() => {
  const myWidget = document.querySelector("#widget-container");
  if (myWidget) {
    window.loadMyWidget();
  }
 });

これで、ホームページに戻ったときにウィジェットが再読み込みされます。