Tenho um componente Glimmer. Ele está funcionando. Mas preciso que ele vá depois do primeiro post em um tópico. Não há um plugin outlet lá.
Eu descobri como inserir algum texto no innerHTML da tag <article>, e isso coloca o texto onde eu quero, mas não parece haver uma maneira de fazer isso com um componente.
Estou perdendo alguma coisa?
Eu olhei como o adplugin insere anúncios entre os posts, mas não consegui entender completamente.
(Existem maneiras legadas de realizar o que você está fazendo, mas elas quebrarão quando modernizarmos a visualização do tópico. Se adicionarmos um ponto de extensão de plugin, será muito mais à prova de futuro)
A postagem é passada como um dos argumentos de saída, então você pode verificar post.post_number == 1
Haha! Sempre feliz em ajudar com esse tipo de pergunta. Muito melhor para todos se pudermos fazer com que temas e plugins usem APIs padrão como esta em vez de soluções alternativas de widgets (que serão descontinuadas em um futuro não tão distante).
Sim, isso é justo. Adicioná-los dentro de widgets é uma dor de cabeça no lado do core. Mas do lado do tema/plugin deve ser super limpo
Tentarei descobrir as falhas nos testes e mesclar o PR amanhã. (Parece que o elemento HTML extra está atrapalhando alguns seletores frágeis nos testes qunit)
Receio ter sido um pouco otimista demais aqui @pfaffman, desculpe! O PR que fiz introduziria um novo wrapper <div> entre cada postagem, mesmo que o outlet não estivesse sendo usado. Isso não é algo que realmente queremos fazer.
Pode haver maneiras de evitar o wrapper… mas nada simples que possamos fazer imediatamente.
Portanto, acho que a melhor solução imediata para você será copiar a implementação do adplugin que você referenciou no OP.
Essencialmente:
Crie um componente (Glimmer ou clássico, não importa) que renderize o que você quiser
Use registerWidgetShim para tornar esse componente disponível como um widget. O exemplo do adplugin está criando um widget chamado “after-post-ad”, que renderiza o componente PostBottomAd. Ele está passando todos os atributos do widget (@data) para o argumento @model do componente.
Use api.decorateWidget para renderizar seu novo widget shim na posição post:after. No seu caso, como você só o quer na primeira postagem, você poderia fazer algo como:
Quando eventualmente fizermos o glimmer-ify da página do tópico, você precisará remover o widget shim/decoração e substituí-lo por um plugin outlet. Isso deve ser bem fácil, já que toda a sua lógica de exibição no componente será reutilizável no plugin outlet.
Nos diga como você se sai! Ficarei feliz em ajudar com quaisquer perguntas de acompanhamento - sei que há muitas partes móveis aqui.
Neste caso, acho que você não precisará importar a classe Service. Isso só seria necessário se você estivesse criando seu próprio Service. Você só precisa do decorador de injeção service.
E na versão mais recente do Discourse/Ember, isso pode ser simplificado ainda mais para evitar a necessidade do alias ‘inject as’. O Ember agora disponibiliza o decorador de injeção diretamente como service.
import { service } from "@ember/service";
(mas o antigo { inject as service } ainda funciona, e não estou ciente de quaisquer planos para depreciá-lo no Ember)
EDIT: Mas talvez eu possa usar decorateWidget em vez de um plugin outlet. . .