Versuch, Glimmer anzuhängen, schlägt mit Fehler fehl

Ich arbeite an einem PR für das Poll-Plugin.

Ich versuche, eine Glimmer-Komponente als Widget-Baum-Blatt zu rendern, wie ich es schon oft getan habe, aber ich bekomme diesen seltsamen Fehler, den ich noch nie zuvor gesehen habe:

TypeError: this.parentMountWidgetComponent is undefined

der in dieser Zeile ausgelöst wird:

Es scheint, dass this.widget?._findView() || this._emberView

undefined ist.

(this.widget existiert)

Mein Code im sehr frühen Stadium ist hier:

Ist es legal, RenderGlimmer in diesem Kontext zu verwenden?

1 „Gefällt mir“

Basiert dies darauf, dass ein Vorfahre diese Eigenschaft hat?

this._findAncestorWithProperty("_emberView")

was undefiniert zurückkommt.

Oder dass es selbst eine _emberView hat (was es nicht hat)

Ich vermute, der Vorfahre hätte es hier setzen sollen:

OK, ein paar weitere Informationen.

Wenn der Poll gerendert wird (als Baum von Widgets), wird diese Zeile ausgeführt, aber wenn Sie zurück zu “Abstimmen” wechseln, wird sie nicht ausgeführt, daher findet sich aus irgendeinem Grund kein Vorfahre mit einer “_emberView” (Oder er wird nicht gefunden)

Die Quelle dieses Problems könnte sein, dass das Widget nie neu gerendert wird:

rerenderWidget()

wird trotz Hinzufügen eines neuen Widget-Baums nicht erneut ausgelöst … daher wird diese Eigenschaft nie gesetzt.

… daher könnte die Lösung darin bestehen, ein erneutes Rendern zu planen, wenn der Abstimm-Button gedrückt wird …

  toggleResults() {
    **this.scheduleRerender();**
    this.state.showResults = !this.state.showResults;
  },

… nein, das löst es nicht.

Mehr Informationen:

  _findAncestorWithProperty(property) {
    let widget = this;
    while (widget) {
      const value = widget[property];
      if (value) {
        return widget;
      }
      widget = widget.parentWidget;
    }
  }

Dies durchsucht den Baum nach der Eigenschaft.

Bei der anfänglichen Ansicht erscheint dies auf der Ebene des post-stream.

Aber irgendwie scheinen die Widgets ihre Abstammung zu verlieren …

OK, ich habe ein wenig weiter recherchiert:

Dies ist die Hierarchie, die beim Durchlaufen der Widgets durchlaufen wird:

discourse-poll-option-dropdown-245da0f65a66dbd539bcd27e501d759a [widget.js:250:14](webpack://discourse/widgets/widget.js)

discourse-poll-option-245da0f65a66dbd539bcd27e501d759a [widget.js:250:14](webpack://discourse/widgets/widget.js)

poll-container-poll-1247 [widget.js:250:14](webpack://discourse/widgets/widget.js)

poll-poll-1247

Nun hat das allerletzte, vorhandene Widget … kein übergeordnetes Widget.

parentWidget ist undefined.

Und der Clou ist, dass es keine „_emberView“-Eigenschaft hat, sodass das Ergebnis undefined ist.

Daher wird die Eigenschaft nie gefunden und an diesem Punkt stoppt die Durchquerung.

3 „Gefällt mir“

Das Poll-Plugin ist insofern etwas ungewöhnlich, als dass das Widget innerhalb des gekochten HTML eines Beitrags eingebunden wird, anstatt direkt über die MountWidget-Komponente in eine Ember-Vorlage eingebunden zu werden. Wir müssen hier wahrscheinlich zusätzliche Logik hinzufügen… werde ich mir ansehen :eyes:

Danke für die Meldung @merefield!

3 „Gefällt mir“

Ich denke, wenn wir das zusammenführen, sollte es Ihren Code zum Laufen bringen @merefield

Es ist nicht besonders schön, aber ich denke, es ist in Ordnung, da dies eine ziemlich seltene Situation ist und wir hoffen, all diese Widget/RenderGlimmer-Sachen in nicht allzu ferner Zukunft komplett herauszureißen :crossed_fingers:

4 „Gefällt mir“

Danke David. Ja, es ist sinnvoll, dass ein Kompromiss vorerst ausreicht :+1:

Ich werde es testen, sobald/falls es zusammengeführt wird (und ich muss meinen Fork aktualisieren! :sweat_smile:)

4 „Gefällt mir“

Ich weiß die schnelle Bearbeitung hier wirklich zu schätzen, David.

Ich kann bestätigen, dass dies jetzt für mich funktioniert.

Ich werde hier posten, wenn ich weitere Probleme mit dieser Vereinbarung feststelle.

(Haftungsausschluss für Screenshots: Dieses Projekt steckt noch in den Kinderschuhen!)

2 „Gefällt mir“

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