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(?
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
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?
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.
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.
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]
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?
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:
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.