Tentative de fixation de Glimmer échoue avec une erreur

Je travaille sur une PR pour le plugin Poll.

J’essaie de rendre un composant Glimmer comme une feuille d’arbre de widget, comme je l’ai fait plusieurs fois auparavant, mais j’obtiens cette erreur étrange que je n’ai jamais vue auparavant :

TypeError: this.parentMountWidgetComponent is undefined

qui se déclenche sur cette ligne :

Il semble que this.widget?._findView() || this._emberView

soit undefined.

(this.widget existe)

Mon code à un stade très précoce est ici :

Est-il légal d’utiliser RenderGlimmer dans ce contexte ?

1 « J'aime »

Cela repose sur un ancêtre qui possède cette propriété ?

this._findAncestorWithProperty("_emberView")

qui renvoie undefined.

Ou sur lui-même qui possède un _emberView (ce qu’il n’a pas)

Je suppose que l’ancêtre aurait dû l’avoir défini ici :

OK, un peu plus d’informations.

Lorsque le sondage est rendu (en tant qu’arbre de widgets), cette ligne est exécutée, mais lorsque vous revenez pour voter, elle ne l’est pas, donc pour une raison quelconque, il n’y a pas d’ancêtre avec un “_emberView” (Ou il n’est pas trouvé)

La source de ce problème pourrait être que le widget n’est jamais réaffiché :

rerenderWidget() {

N’est pas à nouveau déclenché malgré l’ajout d’un nouvel arbre de widgets… donc cette propriété n’est jamais définie.

… ainsi la solution à cela pourrait être de planifier un ré-rendu lorsque le bouton Voter est activé…

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

… non, cela ne résout pas le problème.

Plus d’informations :

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

Ceci recherche la propriété dans l’arbre.

Lors de la vue initiale, cela apparaît au niveau du post-stream.

Mais d’une manière ou d’une autre, les widgets semblent perdre leur ascendance…

OK, j’ai creusé un peu plus loin :

Voici la hiérarchie lors du parcours des widgets :

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

Maintenant, le tout dernier widget existant… n’a pas de widget parent.

parentWidget est undefined.

Et le plus important, c’est qu’il n’a pas de propriété “_emberView”, donc le résultat est undefined.

La propriété n’est donc jamais trouvée et le parcours s’arrête à ce moment-là.

3 « J'aime »

Le plugin de sondage est un peu inhabituel en ce sens que le widget est monté à l’intérieur du HTML cuit d’un article, plutôt qu’à l’intérieur d’un modèle Ember via le composant <MountWidget>. Nous aurons donc probablement besoin d’ajouter une logique supplémentaire ici… j’y jette un œil :eyes:

Merci d’avoir signalé @merefield !

3 « J'aime »

Je pense que si nous fusionnons cela, cela devrait faire fonctionner votre code @merefield

Ce n’est pas particulièrement joli, mais je pense que c’est acceptable car c’est une situation assez rare, et nous espérons supprimer complètement tout ce code widget/RenderGlimmer dans un avenir pas trop lointain :crossed_fingers:

4 « J'aime »

Merci David. Oui, il est logique qu’un compromis puisse suffire en attendant :+1:

Je testerai une fois qu’il sera fusionné (et je devrai mettre à jour ma copie ! :sweat_smile:)

4 « J'aime »

J’apprécie vraiment la rapidité de traitement de ce dossier, David.

Je peux confirmer que cela fonctionne maintenant pour moi.

Je posterai ici si je rencontre d’autres problèmes avec cet arrangement.

(Avertissement concernant la capture d’écran : Ce projet n’en est qu’à ses débuts !)

2 « J'aime »

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