Quali controlli l'ordine di esecuzione per j/s dei componenti Theme?

Ho j/s nel mio tema (sono già famoso? ;)), che modifica il DOM aggiungendo elementi tramite api.decorateCooked(…. Inserisce vari elementi HTML nell’intestazione.

Ho anche installato il componente del tema DiscoTOC.

Tuttavia, aggiungere il solito <div data-theme-toc="true"></div> che DiscoTOC rileva ed espande, non genera una tabella dei contenuti che includa gli elementi che ho inserito dinamicamente.

Penso che questo possa essere dovuto semplicemente all’ordine di esecuzione… se DiscoTOC controlla prima che il mio j/s aggiunga altri elementi . . .

Cosa determina l’ordine di esecuzione se più frammenti di codice j/s del tema chiamano api.cooked(?

3 Mi Piace

sollevo? :slight_smile:

più stupidaggini per arrivare a 20 caratteri

Tieni presente che DiscoTOC funziona solo sui contenuti dei post: se inserisci quegli elementi al di fuori dei post, non li rileverà.

Non credo che sia ancora stato necessario definire l’ordine di esecuzione del JavaScript.

1 Mi Piace

Sì, lo inserisco all’interno del post. Ecco perché sospetto che l’ordine di esecuzione sia il problema.

Una parte del codice determina l’ordine di esecuzione… questo è il punto di leva per me per far apparire il mio componente prima del TOC. Ad esempio, se l’ordinamento è alfabetico in base al nome del componente (cioè come visualizzato nell’elenco dei componenti nell’area di amministrazione), posso provare a nominare il mio componente di conseguenza, ecc.

Sono quasi certo che l’ordine di esecuzione dei componenti non sia basato sul nome del componente. Di default, si basa sull’ID.

Detto questo, puoi impostare l’ordine degli inizializzatori per casi d’uso avanzati. Posso inserire DiscoTOC in un inizializzatore denominato in modo da poter eseguire il tuo codice prima di DiscoTOC, ma devo prima sapere cosa stai cercando di fare per darti una risposta chiara.

Le tue modifiche qui si basano su una richiesta HTTP/AJAX, corretto?

1 Mi Piace

Sì, AJAX, ma usando una chiamata sincrona. (Ho sempre amato l’ossimoro di AJAX sincrono :^)

Sento che il mio prossimo passo è creare un componente appropriato: al momento, è solo un po’ di JavaScript incollato nell’Header del mio Tema. Poi posso provare a giocare con un ID scelto con cura. “_foo” o “0-foo” potrebbero essere tutto ciò che mi serve.

1 Mi Piace

Non siamo tutti d’accordo :wink:

Esatto. Se vuoi utilizzare gli inizializzatori con nome e l’ordine degli inizializzatori, il tuo componente dovrà avere un inizializzatore nella cartella /javascript.

Nessun problema, però. Posso aiutarti con tutto questo. Tornerò da te domani con una risposta completa.

1 Mi Piace

Tempo fa, ho trasformato il mio hacking j/s in un vero e proprio componente tematico.

Mi piacerebbe tornare a occuparmi dell’ordinamento in modo che il mio componente venga eseguito prima dell’indice di Discourse.

Se non ricordo male, i componenti del tema vengono valutati dopo i plugin.

E potrei sbagliarmi, ma vengono caricati in ordine alfabetico, quindi mettere una x- davanti al nome mi ha in passato aiutato a garantire che un componente del tema specifico venisse valutato per ultimo.

Va bene. Sto cercando di gestire l’ordine del componente DiscoTOC ( https://github.com/discourse/DiscoTOC.git ) e di un componente di mia creazione.

Le risposte di altri sopra suggeriscono che il nome del componente non influisce sull’ordine di esecuzione. Li ho appena rinominati in aa-mycomponent e x-last-DiscoTOC e non funziona. [DiscoTOC non include le intestazioni aggiunte dinamicamente al DOM, sì, all’interno del corpo del post]

https://forum.moversmindset.com/t/list-of-movers-mindset-podcast-episodes/1160

@Johani hai altre idee dal tuo ragionamento di maggio?

hmmmmmmm… forse ciò che non va è più dell’ordinamento. Ho appena ispezionato… e le cose nel DOM che pensavo fossero intestazioni HTML… sono in realtà tag DIV con class=\"d-toc-ignore\"

È ora che scavi più a fondo. Dove sono finite le mie intestazioni? :slight_smile:

Beh, penso che potresti dimostrarlo in entrambi i modi provando un esempio molto basilare.

Crea due semplici componenti, sovrascrivendo o collegando la stessa cosa, magari un semplice template con una leggera differenza, chiama uno con un nome che inizia più tardi nell’alfabeto, nota quale finisce per sovrascrivere il tema.

È molto chiaramente ordinato per nome nel codice qui nel modello:

1 Mi Piace

Il nome non influisce sull’ordine di esecuzione. @merefield la riga che hai collegato influisce su come vengono visualizzati nell’interfaccia utente di amministrazione, ma non viene utilizzata per l’esecuzione effettiva.

Questa è la riga pertinente per l’ordine di esecuzione:

Quindi vengono eseguiti in ordine crescente di ‘id’ nel database.

L’unica garanzia che è portabile tra le istanze di Discourse è che il codice del tema viene sempre eseguito prima del codice del componente del tema.

Come menzionato da @Johani sopra, se hai bisogno di eseguire codice dopo che un altro componente è stato caricato, la soluzione migliore è probabilmente utilizzare un inizializzatore Ember, che supporta l’ordinamento. Sfortunatamente, in questo caso non sarà possibile subito, poiché DiscoTOC non sembra utilizzare inizializzatori Ember. L’aggiornamento di DiscoTOC per utilizzare javascript multi-file (e quindi inizializzatori Ember) sarebbe certamente pr-welcome.

3 Mi Piace

È un peccato perché potrebbe essere utile. Grazie comunque per aver chiarito!

1 Mi Piace

(…e questo è correlato a Theme component order of precedence)

Torno solo per dire che l’ordine di precedenza degli ID del database funziona; risolve la mia esigenza. Grazie a tutti!

2 Mi Piace