J’ai du JS dans mon thème (suis-je déjà célèbre ? ;)) qui modifie le DOM en ajoutant des éléments via api.decorateCooked(…. Cela insère divers éléments HTML dans l’en-tête.
J’ai également installé le composant de thème DiscoTOC.
Cependant, l’ajout du usual <div data-theme-toc="true"> </div> que DiscoTOC détecte et étend ne génère pas de table des matières incluant mes éléments insérés dynamiquement.
Je suppose que cela pourrait être aussi simple qu’un problème d’ordre d’exécution… si DiscoTOC s’exécute avant que mon JS n’ajoute plus d’éléments…
Qu’est-ce qui détermine l’ordre d’exécution lorsque plusieurs fragments de code JS du thème appellent api.cooked( ?
Notez que DiscoTOC ne s’exécute que sur le contenu des publications : si vous insérez ces éléments en dehors des publications, il ne les détectera pas.
Je ne pense pas que nous ayons encore eu besoin de définir l’ordre d’exécution du JavaScript.
Je l’insère bien dans le post, oui. C’est pourquoi je soupçonne l’ordre d’exécution.
Une partie du code détermine l’ordre d’exécution… c’est le point de levier pour moi afin d’obtenir mon composant avant le sommaire. Par exemple, si c’est un tri alphabétique par nom de composant (c’est-à-dire tel qu’affiché dans la liste des composants dans la zone d’administration), je peux essayer de nommer mon composant en conséquence, etc.
Cela dit, vous pouvez définir l’ordre des initialiseurs pour des cas d’usage avancés. Je peux placer DiscoTOC dans un initialiseur nommé afin que vous puissiez exécuter votre code avant DiscoTOC, mais j’ai besoin de savoir ce que vous essayez de faire pour vous donner une réponse claire.
Vos modifications ici sont basées sur une requête HTTP/AJAX, c’est bien cela ?
Oui, AJAX, mais avec un appel synchrone. (J’ai toujours adoré l’oxymore du AJAX synchrone :^)
J’ai l’impression que ma prochaine étape est de créer un vrai composant — pour l’instant, ce n’est que du JS collé dans l’en-tête de mon thème. Ensuite, je pourrai essayer de jouer avec un ID judicieusement choisi. “_foo” ou “0-foo” pourrait être tout ce dont j’ai besoin.
Exactement. Si vous souhaitez utiliser des initialisateurs nommés et respecter l’ordre d’initialisation, votre composant devra comporter un initialisateur dans le dossier /javascript.
Pas de panique, cependant. Je peux vous aider avec tout cela. Je reviendrai vers vous demain avec une réponse complète.
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