Tentativo di associare Glimmer fallisce con errore

Sto lavorando a una PR per il plugin Poll.

Sto tentando di renderizzare un Glimmer Component come foglia di un widget tree, come ho fatto diverse volte in precedenza, ma sto riscontrando questo strano errore che non avevo mai visto prima:

TypeError: this.parentMountWidgetComponent is undefined

che si verifica su questa riga:

Sembra che this.widget?._findView() || this._emberView

sia undefined.

(this.widget esiste)

Il mio codice in fase iniziale è qui:

È lecito utilizzare RenderGlimmer in questo contesto?

1 Mi Piace

Questo si basa su un antenato che ha questa proprietà?

this._findAncestorWithProperty("_emberView")

che restituisce undefined.

O che esso stesso abbia un _emberView (cosa che non ha)

Suppongo che l’antenato avrebbe dovuto averlo impostato qui:

Ok, qualche informazione in più.

Quando il sondaggio viene renderizzato (come un albero di widget), questa riga viene eseguita, ma quando si torna indietro per votare, non lo è, quindi per qualche motivo non c’è un antenato con un “_emberView” (o non viene trovato)

La fonte di questo problema potrebbe essere che il widget non viene mai renderizzato di nuovo:

rerenderWidget() {

Non viene più attivato nonostante l’aggiunta di un nuovo albero di widget… quindi questa proprietà non viene mai impostata.

… quindi la soluzione a questo potrebbe essere quella di pianificare un re-render quando viene premuto il pulsante Vota…

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

… no, questo non lo risolve.

Maggiori informazioni:

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

Questo cerca nell’albero la proprietà.

Nella vista iniziale appare a livello di post-stream.

Ma in qualche modo i widget sembrano perdere la loro ascendenza…

OK, ho scavato un po’ più a fondo:

Questa è la gerarchia in cui avviene l’attraversamento del widget:

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

Ora l’ultimo widget esistente… non ha un widget padre.

parentWidget è undefined.

E il colpo di grazia è che non ha la proprietà “_emberView”, quindi il risultato è undefined

Quindi la proprietà non viene mai trovata e a quel punto l’attraversamento si interrompe.

3 Mi Piace

Il plugin poll è un po’ insolito in quanto il widget è montato all’interno dell’HTML cotto di un post, piuttosto che direttamente all’interno di un template Ember tramite il componente <MountWidget>. Quindi probabilmente dobbiamo aggiungere una logica extra qui… ci darò un’occhiata :occhi:

Grazie per la segnalazione @merefield!

3 Mi Piace

Penso che se uniamo questo, dovrebbe far funzionare il tuo codice @merefield

Non è particolarmente bello, ma penso che vada bene dato che questa è una situazione piuttosto rara e speriamo di eliminare completamente tutta questa roba di widget/RenderGlimmer in un futuro non troppo lontano :crossed_fingers:

4 Mi Piace

Grazie David. Sì, ha senso che un compromesso possa bastare nel frattempo :+1:

Lo testerò una volta/se verrà unito (e dovrò aggiornare il mio fork! :sweat_smile:)

4 Mi Piace

Apprezzo molto la rapida risposta su questo, David.

Confermo che ora funziona per me.

Pubblicherò qui se riscontrerò ulteriori problemi con questo accordo.

(Avvertenza sullo screenshot: Giorni molto precoci per questo progetto!)

2 Mi Piace

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