コントローラーでのゲッターの上書きに関する問題 (3.0.0)

イニシャライザーにこのコードがあり、allAdminRoutes のゲッターをオーバーライドしようとしています。

    api.modifyClass('controller:admin-plugins', {
      pluginId: PLUGIN_ID,

      get allAdminRoutes() {
        return this.model
          .filter(p => p?.enabled)
          .map(p => {
            return p.admin_route;
          })
          .filter(Boolean);
      },
    });

TypeError: this.model is undefined というエラーが発生しています。

別に構わないのですが、これは単に 元のゲッターコード です(まだ何も変更していません!)

何が足りないのでしょうか?この方法でゲッターをオーバーライドすることはサポートされていないのでしょうか、それとも何らかのスコープの問題が発生しますか?

「いいね!」 4

不思議なことに、これは最新版では問題ではないようです。(これは本番環境でのテストでした。)

クリーンな3.0.0安定版で再現できるか確認します。

「いいね!」 1

サンプルは機能するはずですが、安定版リリースと現在との間に、関連する変更があったとは認識していません。もし問題が再現できた場合は、お知らせください!

「いいね!」 1

デイビッドさん、ありがとうございます。そうします。はい、気づきました。環境が完全にクリーンではなかったため、今は明らかに私の番です。

「いいね!」 1

Davidさん、これは(奇妙なことに)以下のようです。

  • 本番環境では動作します。
  • 開発環境 3.0.0 以降(それ以前の可能性もあり)では失敗します。
    • Docker を使用しない純粋な開発環境でも、非常にクリーンな(ただし設定が不完全な可能性のあるカスタム Docker 開発環境)でもテストしました。

エラーは以下のとおりです。

エラーが発生しました:

- レンダリング中:
  -トップレベル
    アプリケーション
      discourse-root
        sidebar-wrapper
          admin
            admin-wrapper
              nav-item
                link-to
                  -link-to
(Promise でキャッチされませんでした) TypeError: ルート "adminPlugins" へのリンク生成中に:this.model が未定義です
    get allAdminRoutes admin-plugins.js:20

return this.model の前にデバッガーステートメントを挿入しても、デバッガーが起動しないことに注意してください。

RGJ さんも親切にこれを確認してくれて、この結果を再現できるとのことです。

これは明らかに、本番環境にデプロイする前に開発する必要があるため、少々問題です…言うまでもありませんね! :sweat_smile: また、Stable で問題が発生しているのも少々厄介です…

とりあえず Bug に移動しました…

「いいね!」 2

OK、ここでの問題はさらに確実になりました…スタックトレースで mergeMixins が言及されているためです。

(これを見つけてくれた @RGJ さん、ありがとうございます)

「いいね!」 4

素晴らしい調査です - @merefield@RGJ さん、ありがとうございます。

Discourse 内でこれを修正するには、あまり多くのことはできないと思います。指摘されたように、問題は Ember のアップストリームにあるようです。問題のあるメソッドをパッチできるかもしれませんね :thinking:

開始するために、進捗を追跡できるように、最小限の失敗するテストケースを追加しました。テストには、modifyClass システムによって問題がトリガーされる理由を説明するコメントがいくつかあります。

「いいね!」 4

ええ、あなたの努力にも感謝します。その問題が未解決のままになっているのは奇妙ですね? (Ember) 4.x で解決されるかご存知ですか?

残念ながら、Ember 4.x でも問題はまだ存在するようです :cry:

「いいね!」 1

おかしいことに、Emberプロジェクトではそれが唯一の進歩のようです。関連するPRはまだドラフト中です。時間があれば、優先順位を付けるよう丁寧に依頼するだけで十分かもしれません。

これは第三者のスタッフメンバーによって開かれたものであることを十分に理解しています。

GitHub - emberjs/ember.js: Ember.js - A JavaScript framework for creating ambitious web applications で、このPR、このトピック、そしてあなたのテストを参照して、問題を提起する価値はありますか?

はい、私のテストはそれらに基づいています(ただし、ディスコース固有のapi.modifyClass APIを使用しています)。新しいイシューを開くべきではないと思います。これは、すでに開いているものと100%同じです。優先度を上げるために何かできるかどうか見てみましょう。

「いいね!」 3

進捗がありました。修正のためのPRが [BUGFIX LTS] Don't run getters while applying mixins by wycats · Pull Request #20388 · emberjs/ember.js · GitHub で公開されました。

それがマージされ、Ember 3.28 にバックポートされたら、できるだけ早く Discourse に適用することを目指します。

「いいね!」 3

バックポート?!それは素晴らしいニュースだと思っていました!

この件をまとめてくれたデビッドさん、ありがとうございます!

この修正は Ember 3.28.12 の一部としてリリースされ、Discourse を更新して使用するようにしました。最新の Discourse に更新した後も modifyClass で問題が発生している場合は、お知らせください。

「いいね!」 6

素晴らしいデビッド、どうもありがとう!

「いいね!」 2

このトピックは9日後に自動的に閉じられました。返信はもうできません。