Quais controles a ordem de execução para j/s dos componentes 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 curtidas

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 curtida

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 curtida

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 curtida

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 curtida

Há um tempo, transformei meu hack de j/s em um componente de tema adequado.

Gostaria de voltar a organizar a ordem de forma que meu componente seja executado antes do índice de conteúdo do Discourse.

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.

Tudo bem. Estou tentando controlar a ordem do componente DiscoTOC ( https://github.com/discourse/DiscoTOC.git ) e um componente da minha própria criação.

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]

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

@Johani alguma ideia adicional do seu raciocínio de maio?

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

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:

1 curtida

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

3 curtidas

É lamentável, pois poderia ser útil. Obrigado por esclarecer, de qualquer forma!

1 curtida

(…e isso está relacionado a Theme component order of precedence)

Só voltando para dizer que a ordem de precedência do ID do banco de dados funciona; resolve minha necessidade. Obrigado a todos!

2 curtidas