Ho un componente Glimmer. Funziona. Ma ho bisogno che vada dopo il primo post in un argomento. Non c’è un plugin outlet lì.
Ho capito come inserire del testo in innerHTML del tag <article>, e questo inserisce quel testo dove voglio, ma non sembra esserci un modo per farlo con un componente.
Mi sto perdendo qualcosa?
Ho guardato come adplugin inserisce annunci tra i post, ma non sono riuscito a capirlo del tutto.
(ci sono modi legacy per realizzare ciò che stai facendo, ma si romperanno quando modernizzeremo la vista dell’argomento. Se aggiungiamo una presa per plugin, sarà molto più a prova di futuro)
Il post viene passato come uno degli argomenti dell’output, quindi puoi controllare post.post_number == 1
Haha! Sempre felice di aiutare con questo tipo di domande. Molto meglio per tutti se possiamo far utilizzare a temi e plugin API standard come questa piuttosto che soluzioni alternative tramite widget (che saranno deprecate in un futuro non troppo lontano).
Sì, è giusto. Aggiungerli all’interno dei widget è un mal di testa per il core. Ma dal lato tema/plugin dovrebbe essere super pulito
Cercherò di capire i fallimenti dei test e di unire il PR domani. (Sembra che l’elemento HTML aggiuntivo stia creando problemi con alcuni selettori fragili nei test qunit)
Temo di essere stato un po’ troppo ottimista qui @pfaffman, scusa! Il PR che ho fatto introdurrebbe un nuovo wrapper <div> tra ogni singolo post, anche se l’outlet non veniva utilizzato. Non è proprio quello che vogliamo fare.
Potrebbero esserci modi per evitare il wrapper… ma niente di semplice che possiamo fare immediatamente.
Quindi penso che la migliore soluzione immediata per te sarà copiare l’implementazione di adplugin a cui hai fatto riferimento nell’OP.
Essenzialmente:
Crea un componente (Glimmer o classico, non importa) che renderizza ciò che desideri
Usa registerWidgetShim per rendere quel componente disponibile come widget. L’esempio di adplugin sta creando un widget chiamato “after-post-ad”, che renderizza il componente PostBottomAd. Sta passando tutti gli attributi del widget (@data) all’argomento @model del componente.
Usa api.decorateWidget per renderizzare il tuo nuovo widget shim nella posizione post:after. Nel tuo caso, dato che lo desideri solo sul primo post, potresti fare qualcosa di simile
Quando alla fine faremo il glimmer-ify della pagina dell’argomento, dovrai rimuovere il widget shim/decorazione e sostituirlo con un plugin outlet. Dovrebbe essere abbastanza facile, dato che tutta la tua logica di visualizzazione nel componente sarà riutilizzabile nel plugin outlet.
Facci sapere come va! Felice di aiutarti con qualsiasi domanda di follow-up - so che ci sono molte parti in movimento qui.
In questo caso, non credo che avrai bisogno di importare la classe Service. Sarebbe necessaria solo se stessi creando il tuo Service. Hai solo bisogno del decoratore di iniezione service.
E nell’ultima versione di Discourse/Ember, può essere semplificata ulteriormente per evitare di aver bisogno dell’alias ‘inject as’. Ember ora rende il decoratore di iniezione disponibile direttamente come service.
import { service } from "@ember/service";
(ma il vecchio { inject as service } funziona ancora e non sono a conoscenza di piani per deprecato in Ember)
EDIT: Ma forse posso usare decorateWidget invece di un plugin outlet. . .