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.
pelo que me lembro, os Componentes de Tema são avaliados depois dos plugins.
E posso estar enganado, mas eles são carregados em ordem alfabética, então colocar um x- na frente do nome já me ajudou no passado a garantir que um Componente de Tema específico fosse avaliado por último.
Respostas de outros usuários acima sugerem que o nome do componente não afeta a ordem de execução. Acabei de renomeá-los para aa-mycomponent e x-last-DiscoTOC e não funcionou. [DiscoTOC não inclui cabeçalhos adicionados dinamicamente ao DOM — sim, dentro do corpo da postagem]
hmmmmmmm… talvez o que está errado seja mais do que apenas a ordem. Acabei de inspecionar… e as coisas no DOM que eu pensava serem títulos HTML… são na verdade tags DIV com class=\"d-toc-ignore\"
Hora de investigar mais a fundo. Onde foram parar meus títulos?
Bem, eu acho que você poderia provar isso de qualquer maneira tentando um exemplo muito básico.
Crie dois componentes simples, substituindo ou conectando a mesma coisa, talvez um modelo simples com uma pequena diferença, chame um por um nome que comece mais tarde no alfabeto, observe qual acaba substituindo o tema.
Está muito claramente ordenado por nome no código aqui no modelo:
O nome não afeta a ordem de execução. @merefield a linha que você vinculou afeta como eles são exibidos na interface do administrador, mas não é usada para a execução real.
Esta é a linha relevante para a ordem de execução:
Portanto, eles são executados em ordem crescente de ‘id’ no banco de dados.
A única garantia que é portátil entre instâncias do Discourse é que o código do tema é sempre executado antes do código do componente do tema.
Como @Johani mencionou acima, se você precisar executar código após o carregamento de outro componente, a melhor opção provavelmente seria usar um inicializador Ember, que suporta ordenação. Infelizmente, isso não será possível imediatamente neste caso, pois parece que o DiscoTOC não está usando inicializadores Ember. Atualizar o DiscoTOC para usar javascript de vários arquivos (e, portanto, inicializadores Ember) certamente seria pr-welcome