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

I have j/s in my theme (am I infamous yet? ;) which is modifying the DOM by adding elements via api.decorateCooked(…. It inserts a variety HTML head elements.

I also have the DiscoTOC Theme component installed.

However, adding the usual <div data-theme-toc="true"> </div> that DiscoTOC notices and expands, doesn’t generate a table-of-contents including my dynamically inserted elements.

I’m figuring this might be as simple as execution order… if DiscoTOC looks before my j/s adds more elements . . .

What determines the ordering of execution if multiple bits of theme j/s code are calling api.cooked(?

3 Mi Piace

bump? :slight_smile:

plus silliness to get to 20 characters

Note that DiscoTOC only runs on post contents - if you’re inserting those elements outside posts, it won’t see them.

I don’t think we’ve needed to define JS execution order yet.

1 Mi Piace

I’m inserting within the post, yes. That’s why I suspect execution order.

Some bit of code determines the execution order… that’s the leverage point for me to get my component before TOC. eg, if it’s alpha by component name (ie, as displayed in the Component list in Admin area) then I can try namin my component accordingly, etc

Pretty sure that the component execution order is not based on the name of the component. It’s based on the ID by default.

That said, you can set initializer order for advanced use cases. I can put DiscoTOC in a named initializer so you can run your code before DiscoTOC, but I need to know what you’re trying to do first to give you a clear answer.

Your modifications here are based on an HTTP/AJAX request, correct?

1 Mi Piace

Yes AJAX, but using a synchronous call. (I’ve always loved the oxymoron of synchronous AJAX :^)

I’m feeling like my next step is create a proper component—atm, it’s just some j/s pasted into my Theme’s Header. Then I can try fiddling with a judiciously chosen ID. “_foo” or “0-foo” might be all I need.

1 Mi Piace

Don’t we all :wink:

Correct. If you want to use named initializers and initializer order, your component will need to have an initializer in the /javascript folder.

No worries, though. I can help with all of that. I’ll get back to you on this tomorrow with a full answer.

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