Probleme beim Überschreiben von Gettern in einem Controller (3.0.0)

Ich habe diesen Code in meinem Initialisierer, der versucht, den Getter für allAdminRoutes zu überschreiben:

    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);
      },
    });

Er schlägt mit folgender Fehlermeldung fehl:

TypeError: this.model is undefined

Nun, es wäre mir egal, aber es ist nur der ursprüngliche Getter-Code (ich habe ihn noch nicht einmal geändert!)

Was übersehe ich? Wird das Überschreiben eines Getters auf diese Weise nicht unterstützt oder führt es eine Art von Gültigkeitsbereichsproblem ein?

4 „Gefällt mir“

Seltsamerweise scheint dies kein Problem mit der neuesten Version zu sein. (Das war nur ein Test in der Produktion.)

Ich werde sehen, ob ich dies auf einer sauberen 3.0.0 Stable reproduzieren kann.

1 „Gefällt mir“

Das Beispiel sollte funktionieren, und mir sind keine relevanten Änderungen zwischen der stabilen Version und jetzt bekannt. Lassen Sie uns wissen, wenn es Ihnen gelingt, das Problem zu reproduzieren!

1 „Gefällt mir“

Danke David. Werde ich machen. Ja, das ist mir aufgefallen. Der Ball liegt definitiv bei mir, da die Umgebung, in der ich das erlebt habe, nicht ganz sauber war.

1 „Gefällt mir“

OK David, es scheint (und das ist seltsam):

  • funktioniert in der Produktion
  • schlägt in der Entwicklung 3.0.0 und neuer fehl (möglicherweise auch früher)
    • Ich habe es in einer reinen Dev-Umgebung ohne Docker getestet, aber auch in einer sehr sauberen (aber möglicherweise mit unvollständiger Konfiguration versehenen, maßgeschneiderten Docker-Dev-Umgebung).

Hier sind die Fehler:

Fehler aufgetreten:

- Beim Rendern von:
  -top-level
    application
      discourse-root
        sidebar-wrapper
          admin
            admin-wrapper
              nav-item
                link-to
                  -link-to
Uncaught (in promise) TypeError: Beim Generieren eines Links zur Route "adminPlugins": this.model ist undefiniert
    get allAdminRoutes admin-plugins.js:20

Beachten Sie, dass ich eine Debugger-Anweisung vor dem return this.model einfügen kann und der Debugger niemals ausgelöst wird.

@RGJ hat sich das freundlicherweise auch angesehen und kann dieses Ergebnis reproduzieren.

Das ist ein ziemliches Problem, da wir offensichtlich Dinge entwickeln müssen, bevor sie in die Produktion gehen … aber das muss ich Ihnen ja nicht erzählen! :sweat_smile: Es ist auch ein bisschen ärgerlich, dass es ein Problem auf Stable gibt …

Vorerst verschoben nach Bug

2 „Gefällt mir“

OK, wir sind uns hier eines Problems noch sicherer … da mergeMixins im Stack-Trace erwähnt wird

(danke an @RGJ für diesen Fund)

4 „Gefällt mir“

Tolle Recherche – danke @merefield und @RGJ

Ich bin mir nicht sicher, wie viel wir innerhalb von Discourse beheben können – wie Sie bemerkt haben, scheint das Problem stromaufwärts in Ember zu liegen. Vielleicht können wir die problematische Methode patchen :thinking:

Um uns den Einstieg zu erleichtern, habe ich einen minimalen, fehlschlagenden Testfall hinzugefügt, damit wir den Fortschritt verfolgen können. Es gibt einige Kommentare im Test, die beschreiben, warum das Problem durch unser modifyClass-System ausgelöst wird:

4 „Gefällt mir“

Ja, danke auch für deine Bemühungen. Es ist seltsam, dass sie dieses Problem ungelöst gelassen haben? Wissen wir, ob (Ember) 4.x es lösen wird?

Leider scheint das Problem in Ember 4.x immer noch zu bestehen :cry:

1 „Gefällt mir“

Interessanterweise scheint das der einzige Fortschritt beim Ember-Projekt zu sein, innerhalb des zugehörigen PR, der sich noch im Entwurfsstadium befindet. Ich frage mich, ob alles, was erforderlich wäre, eine höfliche Bitte wäre, ihn zu priorisieren, wenn die Zeit verfügbar ist?:

Ich verstehe vollkommen, dass dies von einem Mitarbeiter eines Drittanbieters eröffnet wurde.

Lohnt es sich, ein Problem unter GitHub - emberjs/ember.js: Ember.js - A JavaScript framework for creating ambitious web applications zu melden und auf diesen PR, dieses Thema und Ihren Test zu verweisen?

Ja, mein Test basiert auf ihrem (aber mit der Discourse-spezifischen api.modifyClass-API). Ich glaube nicht, dass wir ein neues Issue eröffnen sollten – es ist zu 100 % dasselbe wie das, das bereits offen ist. Wir werden sehen, ob wir etwas tun können, um es zu priorisieren.

3 „Gefällt mir“

Hier machen wir Fortschritte – wir haben jetzt einen PR mit einem Fix offen unter [BUGFIX LTS] Don't run getters while applying mixins by wycats · Pull Request #20388 · emberjs/ember.js · GitHub

Sobald dieser zusammengeführt und nach Ember 3.28 zurückportiert wurde, werden wir ihn so schnell wie möglich auf Discourse anwenden.

3 „Gefällt mir“

Zurückportiert?! Das habe ich mich gefragt, tolle Neuigkeiten!

Danke, dass du das hier betreut hast, David!

Diese Korrektur wurde nun als Teil von Ember 3.28.12 veröffentlicht, und wir haben Discourse aktualisiert, um es zu verwenden. Bitte lassen Sie uns wissen, wenn Sie nach der Aktualisierung auf das neueste Discourse immer noch Probleme mit modifyClass feststellen.

6 „Gefällt mir“

Super David, vielen Dank!

2 „Gefällt mir“

Dieses Thema wurde nach 9 Tagen automatisch geschlossen. Neue Antworten sind nicht mehr möglich.