Caricamento argomenti in un nuovo outlet di plugin che ho aggiunto

Ciao. Sto cercando di passare una lista di argomenti a {{topic-list topics=myChosenTopics}} in un nuovo template che ho creato in un plugin.

Quindi sto cercando di capire come impostare il valore per “myChosenTopics” nel mio file JS in modo che possa essere passato a topic-list.

La soluzione più vicina che ho trovato è il metodo setupComponent(args, component) {..component.set('myChosenTopics', myChosenTopics); descritto qui: https://meta.discourse.org/t/how-to-add-a-featured-topic-list-to-your-discourse-homepage/132949.

Esiste un modo migliore?

Se no, sembra che questo metodo funzioni solo quando si collega a una classe di connettore (cioè con un plugin outlet). Ci sono passaggi speciali che devo compiere per aggiungere un nuovo plugin outlet a un template?

Penso di aver fatto funzionare questa cosa. Obiettivo: caricare determinati argomenti in un punto specifico di un nuovo modello (probabilmente funziona anche per l’aggiunta a modelli esistenti, ma non l’ho testato):

  1. Inserisci il tuo outlet plugin inventato nel tuo modello (il mio outlet plugin inventato si chiama “great-topics”, ad esempio):

{{plugin-outlet name="great-topics"}}

  1. Aggiungi il codice Handlebars (ovvero il tuo componente) in un connettore:

[your-plugin]/assets/javascripts/discourse/connectors/great-topics/new-component.hbs

<div>Sono nell'outlet plugin! Carica gli argomenti:</div>
{{topic-list topics=featuredTopics showPosters=true}}
  1. Aggiungi il codice JavaScript per il componente che si trova nel tuo nuovo connettore:

[your-plugin]/assets/javascripts/discourse/connectors/great-topics/new-component.js.es6
[questo codice è adattato dal seguente post su Meta che contiene codice per caricare argomenti con il tag “featured”: https://meta.discourse.org/t/how-to-add-a-featured-topic-list-to-your-discourse-homepage/132949]

const ajax = require('discourse/lib/ajax').ajax;
const Topic = require('discourse/models/topic').default;

setupComponent(args, component) {
 ajax("/tag/featured.json").then(function (result) {
                 
   let featuredTopics = [];
   // Crea un array vuoto, vi spingeremo gli argomenti

   var featuredUsers = result.users;
   // Ottieni gli utenti rilevanti

   result.topic_list.topics.slice(0, 4).forEach(function (topic) {
   // Stiamo estraendo gli argomenti partendo da 0 fino a 4
   // Questo significa che ne mostreremo 3 in totale. Aumenta 4 per mostrarne di più.

     topic.posters.forEach(function (poster) {
        poster.user = $.grep(featuredUsers, function (e) { return e.id == poster.user_id; })[0];
                        });
         // Associa gli utenti al nostro argomento

      featuredTopics.push(Topic.create(topic));
        // Aggiungi i nostri argomenti all'array featuredTopics
     });
   }) // fine result.topic.topic_list...
                    
component.set('featuredTopics', featuredTopics);  // qui gli argomenti vengono aggiunti al componente
 
component.set("loadingTopics", false); //il mio codice sopra non ha un caricatore. ma questo è presente se vuoi un caricatore. Devi aggiungerlo al file hbs per quello. Vedi il post collegato su Meta sopra

  }); // fine ajax 


 }// fine setup component


Per me funziona, almeno per caricare argomenti con il tag “featured” nell’outlet plugin del mio nuovo modello.

Per vedere questo in funzione, sarà necessario riavviare il server.

Questa idea sembra interessante.