Qu'est-ce qui contrôle l'ordre d'exécution du j/s des composants 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 « J'aime »

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 « J'aime »

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 « J'aime »

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 « J'aime »

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 « J'aime »

Il y a quelque temps, j’ai transformé mon piratage j/s en un composant de thème approprié.

J’aimerais revenir à l’organisation de sorte que mon composant s’exécute avant la table des matières de Discourse.

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]

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

@Johani, d’autres idées suite à votre réflexion de mai ?

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 ? :slight_smile:

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 :

1 « J'aime »

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

3 « J'aime »

C’est dommage car cela pourrait être utile. Merci de clarifier en tout cas !

1 « J'aime »

(… et, ceci est lié à Theme component order of precedence )

Pour faire un suivi, je voulais dire que l’ordre de priorité des ID de base de données fonctionne ; cela résout mon problème. Merci à tous !

2 « J'aime »