Come posso aggiornare l'elenco degli argomenti dopo aver apportato una modifica?

Ho implementato un pulsante personalizzato nel menu delle azioni del post che “espelle” il post dal thread dell’argomento corrente. È un’azione disponibile per l’autore dell’argomento che esegue essenzialmente l’operazione di spostamento, ma con meno clic. L’operazione di backend viene eseguita da un nuovo endpoint API personalizzato. Il mio pulsante funziona, tranne per il fatto che devo aggiornare manualmente la pagina per vedere che il post è stato spostato.

Dopo l’aggiornamento, il post appare così:

La mia domanda è: qual è il modo migliore per aggiornare il DOM con questa modifica? Idealmente, sostituirei solo il post con il segnaposto di divisione mostrato sopra, ed eviterei di aggiornare l’intera pagina o l’elenco completo degli argomenti.

Posso immaginare che, se il mio endpoint API restituisce l’argomento modificato, allora devo solo sostituire/iniettare il nuovo post nell’elenco degli argomenti?

Quindi, immagino che questa sia una domanda su come funziona la gestione dello stato all’interno di Discourse e su come posso agganciarmi a quel ciclo di vita.

2 Mi Piace

Cerca in core (o nel repository all-the-plugins) elementi che aggiornano MessageBus

1 Mi Piace

Soluzione

Mettere questo alla fine del mio metodo API ha risolto il problema:

MessageBus.publish("/topic/#{@topic.id}", reload_topic: true, refresh_stream: true)

Questo dovrebbe aggiornare non solo per l’utente corrente, ma anche per chiunque altro stia visualizzando l’argomento.

Esplorazione che mi ha portato qui

Continua a leggere se vuoi seguire il mio percorso attraverso la codebase. Condivido questo per chiunque altro possa trovarlo utile.

Cos’è MessageBus?

Dalla spiegazione di Sam del 2013 su MessageBus sembra che il codice Ruby possa pubblicare e sottoscrivere, mentre il codice Javascript può solo sottoscrivere. Ok, quindi sotto questa architettura proposta il mio codice lato server sarà responsabile di notificare l’interfaccia utente.

Esiste un esempio di MessageBus che mi è utile?

Nessuno degli esempi di plugin fa nulla con MessageBus.

GroupArchivedMessage.move_to_inbox! chiama questo codice che è piuttosto vicino a quello che voglio, ma il tipo di codice utilizzato qui non funzionerà per me.

MessageBus.publish("/topic/#{topic_id}", { type: "move_to_inbox" }, group_ids: [group_id])

Questo codice sembra promettente.

MessageBus.publish("/topic/#{@topic.id}", reload_topic: true, refresh_stream: true)

Questa è stata la soluzione finale che ho scelto.

Cosa succede quando il browser riceve l’aggiornamento?

Il controller degli argomenti è sottoscritto agli aggiornamenti sull’argomento che sta visualizzando. Attiva "post-stream:refresh", che avvia l’aggiornamento. L’unica cosa che riesco a trovare in ascolto dall’altra parte è ScrollingPostStream che collega un metodo _refresh all’evento. Questo sembra essere ciò che sta effettivamente eseguendo l’aggiornamento.

Da questo deduco che se volessi aggiornare solo il client attuale senza inviare l’aggiornamento a nessun altro, potrei chiamare lo stesso codice da solo:

this.appEvents.trigger("post-stream:refresh", args)

E sembra che potrei chiamarlo da qualsiasi componente.

E l’implementazione originale di move_posts? Pubblica su MessageBus?

Indagando sul core vedo: il metodo move_posts() del controller degli argomenti chiama move_posts_to_destination() che chiama topic.move_posts() che chiama new PostMover() e poi to_topic() o to_new_topic(). Questi metodi non chiamano MessageBus, ma chiamano DiscourseEvent.trigger().

Chiamo topic.move_posts() dal mio metodo API personalizzato. Quindi il mio codice chiama direttamente il modello, saltando tutta la logica esistente del controller:

new_topic = topic.move_posts(current_user, [post.id], {title: title, category_id: category_id})

Nel mio caso viene chiamato move_posts_to() come ultimo passaggio della sequenza, che chiama quanto segue:

DiscourseEvent.trigger(
  :posts_moved,
  destination_topic_id: destination_topic.id,
  original_topic_id: original_topic.id,
)

DiscourseEvent non sembra avere nulla a che fare con MessageBus, tuttavia. Forse è utilizzato solo per i cicli di vita interni al server?

Quindi concludo che MessageBus non viene normalmente pubblicato per uno spostamento di argomento.

4 Mi Piace

Oh. Mi dispiace. È un po’ sorprendente! Suppongo che avrei dovuto mandarti al core! Ho un plugin che lo usa, ma non è pubblico e usa message buss per un modello personalizzato.

Non sono sicuro, ma penso che probabilmente non ti serva ricaricare l’argomento (a meno che non cambino cose che non vengono visualizzate senza gli attributi modificati?), ma ho un paio di posti nel mio plugin dove penso che potrebbe risolvere un problema!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.