指定の差込口にテンプレートが入らない

特定のプラグインのアウトレットにテンプレートを配置しようとしています。javascripts/discourse/initializers/persistent-banner.gjs

コード:

import Component from "@glimmer/component";
import { apiInitializer } from "discourse/lib/api";

banner_plugin_outlet = settings.banner_position

export default apiInitializer("1.14.0", (api) => {
  try {
    banner_plugin_outlet = settings.banner_position
    api.renderInOutlet(
      banner_plugin_outlet,
      class persistentbanner extends Component {
        get bannerIsFilled() {
          if (settings.banner_text_content == "") {
            return false;
          } else if (settings.banner_visible == "hide") {
            return false;
          } else {
            return true;
          }
        }
        <template>
          {{#if this.bannerIsFilled}}
            <div class='persistent-banner'>
              <p>
                {{html_safe (theme-setting 'banner_text_content')}}
              </p>
            </div>
          {{/if}}
        </template>
      }
    );
  } catch (e) {
    console.log(e);
  }
}

しかし、<template> タグ内の HTML がアウトレットの場所に表示されません。実際、まったく表示されません。何が間違っていますか?
リポジトリリンク:GitHub - NateDhaliwal/discourse-persistent-banner: A theme component for Discourse that cannot be closed by the user.

「いいね!」 1

イニシャライザーは使用しないでください。コネクタフォルダを使用してください。たくさんの例があります。

「いいね!」 2

その理由は、選択できるアウトレットがいくつかあるためです。
このコードはNotification Bannerのリポジトリから適応しました。

「いいね!」 2

なるほど、わかりました。はい、理にかなっています。意図が分からず申し訳ありませんでした。もっと詳しくコードを読むべきでした。

「いいね!」 1

もう一度やり直すためのヒントをいくつかご紹介します。

  • このファイルでは、apiInitializer 呼び出しの最後に閉じ括弧がありません。これでは動作しません。

    その問題を修正すると、さらにエラーが見つかりました。

  • banner_plugin_outlet が宣言されていません。ここに const が必要です。

    二重に代入していませんか?おそらく二重に代入する必要はないでしょう :slight_smile:

    banner_plugin_outlet = settings.banner_position
    
    export default apiInitializer("1.14.0", (api) => {
      try {
        banner_plugin_outlet = settings.banner_position
    
  • インポートが不足しています。

    import { htmlSafe } from "@ember/template";
    import themeSetting from "discourse/helpers/theme-setting";
    
  • … しかし、themeSetting をヘルパーとしてここで機能させることができませんでした。エラーはありませんでしたが、何も表示されなかったので、代わりにこのコードを試してください。

            get bannerTextContent() {
              return settings.banner_text_content;
            }
            <template>
              {{#if this.bannerIsFilled}}
                <div class='persistent-banner'>
                  <p>
                    {{htmlSafe this.bannerTextContent}}
    
  • 常にコンソールでエラーを確認してください。

「いいね!」 6

htmlSafe をインポートしたところ、見事に機能しました。
本当にありがとうございます!

「いいね!」 2

はい、ヘルパーはgjsでは機能しません(そして必要ありません)。ゲッターを定義することは問題ありません。しかし、それを避けたい場合は、テンプレートから直接settingsの「グローバル」を参照できます。

<template>
  {{htmlSafe settings.banner_text_content}}
</template>
「いいね!」 4

ありがとうございます。あまり透明ではなかったようです!:sweat_smile:

「いいね!」 3

はい、それは妥当です。エラーメッセージを改善しましょう。


「いいね!」 5

ありがとうございます。これは開発者体験に大いに役立ちます。

ご存知の通り、.gjs はウィジェットよりも劇的に改善されました。

しかし

gjs コンポーネントを使用すると、非常に奇妙なエラーがたくさん発生し、問題の特定が容易ではありません。

たとえば、ヘルパー名を間違えてみましょう。
{{html_safe this.bannerTextContent}}

これは古典的なものにつながります。

program.js:100 Uncaught (in promise) TypeError: WeakMap のキーとして無効な値が使用されました
at WeakMap.set (<anonymous>)

(インポートを忘れた場合、有効な名前でもここで発生します)

なんてこった! :sweat_smile: これのような例はたくさんあります。

フレームワークを使用することの欠点でしょうか?

「いいね!」 3

痛っ、それはひどいですね!

ローカルで試すと、次のように表示されます。

WeakMap エラーはどこで確認しましたか?本番サイトですか?もしそうなら…これは、パフォーマンスを向上させるために ember が本番ビルドから最適化して削除するチェックの 1 つかもしれません。

可能であれば、テーマ/プラグインは適切な開発環境で開発することを常にお勧めします。このような多くのケースで、エクスペリエンスが向上します。

「いいね!」 4

はい、プロダクションサイトでTheme CLI(を使用しています。これは、それ以外は素晴らしいワークフローであるにもかかわらず、欠点の一つだと思いますか?)

それは非常に理にかなっています。

はい、プラグインの場合はそれが私の定番ですが、TCの場合は、フィードバックの即時性(常に役立つとは限りませんが!)のために、プロダクションサイトに対して開発する誘惑があります。

しかし、今気づきました。CLIでlocalhostに入ることができ、それは機能します。

だから、まあ!

image

今後それを使用します! :rocket:

それが可能だと思わなかった理由が全くわかりません :blush: :sweat_smile:

いつものように、あなたの助けに感謝します。多くの時間を節約できました(将来的に :))。

「いいね!」 2

はい!テーマCLIを使ったローカルホストでの作業は、私が普段行っている方法であり、他の人にも推奨している方法です。これらの推奨されるワークフローのドキュメントは、間違いなく改善できます :eyes:

もう一つのヒントは、discourse.theme-creator.io が開発モードのEmberアセットで動作していることです。そのため、こちらもより良いエラーメッセージが表示されるはずです。

「いいね!」 4

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.