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.
iirc, les composants de thème sont évalués après les plugins.
Et je peux me tromper, mais ils sont chargés dans l’ordre alphabétique, donc mettre un x- devant le nom m’a permis par le passé de m’assurer qu’un composant de thème spécifique était évalué en dernier.
C’est bon. J’essaie de gérer l’ordre du composant DiscoTOC ( \u003chttps://github.com/discourse/DiscoTOC.git\u003e ) et d’un composant de ma création.
Les réponses des autres ci-dessus suggèrent que le nom du composant n’affecte pas l’ordre d’exécution. Je viens de les renommer en aa-mycomponent et x-last-DiscoTOC et cela ne fonctionne pas. [DiscoTOC n’inclut pas les titres ajoutés dynamiquement au DOM — oui, dans le corps du message]
hmmmmmmm… peut-être que ce qui ne va pas est plus qu’une commande. Je viens d’inspecter… et les éléments dans le DOM que je pensais être des titres HTML… sont en fait des balises DIV avec class=\"d-toc-ignore\"
Il est temps pour moi de creuser plus loin. Où sont passés mes titres ?
Eh bien, je pense que vous pourriez prouver cela dans un sens ou dans l’autre en essayant un exemple très basique.
Créez deux composants simples, en remplaçant ou en connectant la même chose, peut-être un modèle simple avec une légère différence, nommez-en un avec un nom commençant plus tard dans l’alphabet, notez lequel finit par remplacer le thème.
C’est très clairement ordonné par nom dans le code ici dans le modèle :
Le nom n’affecte pas l’ordre d’exécution. @merefield la ligne que vous avez liée affecte la façon dont ils sont affichés dans l’interface utilisateur d’administration, mais n’est pas utilisée pour l’exécution réelle.
Voici la ligne pertinente pour l’ordre d’exécution :
Ils sont donc exécutés dans l’ordre croissant de « id » dans la base de données.
La seule garantie portable entre les instances de Discourse est que le code du thème est toujours exécuté avant le code du composant du thème.
Comme l’a mentionné @Johani ci-dessus, si vous avez besoin d’exécuter du code après le chargement d’un autre composant, le mieux serait probablement d’utiliser un initialiseur Ember, qui prend en charge l’ordre. Malheureusement, ce ne sera pas possible immédiatement dans ce cas, car il semble que DiscoTOC n’utilise pas les initialiseurs Ember. La mise à jour de DiscoTOC pour utiliser javascript multi-fichiers (et donc les initialiseurs Ember) serait certainement pr-welcome