Ciao.
Quando cambiamo pagina in Discourse, i passaggi apparenti sono:
Clicchiamo sul link
Il contenuto corrente scompare e appare il caricatore
L’URL viene aggiornato e appare il nuovo contenuto
Questo è leggermente diverso quando passiamo da una pagina alla home: l’URL viene modificato in quello della home quando il contenuto corrente scompare, non quando appare il nuovo contenuto.
Il mio obiettivo è avere uno script che venga eseguito non appena clicchiamo su qualsiasi link di pagina in Discourse. api.onPageChange non va bene in questo caso, poiché il codice viene eseguito più o meno nello stesso momento in cui viene caricato il contenuto della nuova pagina.
Esiste un metodo Discourse per questo? Ho esaminato i trigger degli eventi, ma non ne ho trovato uno che corrisponda a ciò di cui ho bisogno.
Attualmente non esiste un metodo nella Plugin-API che permetta di eseguire uno script prima di una transizione di pagina, poiché, per quanto mi ricordi, questa esigenza non si era mai presentata in precedenza.
Detto questo, puoi sfruttare l’azione willTransition() nella rotta dell’applicazione
Nel tuo tema o componente, useresti qualcosa di simile a questo:
// questo viene eseguito dopo la transizione
api.onPageChange((url, title) => {
console.log("dopo la transizione");
});
// questo viene eseguito subito prima della transizione
api.modifyClass("route:application", {
pluginId: "some-name",
actions: {
willTransition() {
// esegui prima il codice principale
this._super(...arguments);
// poi esegui alcune operazioni
console.log("prima della transizione");
// puoi anche fare qualcosa del genere per vedere quali dati hai a disposizione
// con cui lavorare, come _router
console.log(this)
}
}
});
Un paio di ragioni per cui potrebbe non funzionare:
Mettere le azioni in un hash è una sintassi vecchia che non usiamo più in Discourse. Teoricamente dovrebbe funzionare, ma l’interoperabilità con la nuova sintassi potrebbe non essere perfetta. Il modo moderno sarebbe
si applica il disclaimer standard di modifyClass: questo è rischioso e potrebbe interrompersi in qualsiasi momento
Non credo che willTransition sia garantito che venga attivato sulla route dell’applicazione in tutte le situazioni. (ad esempio, se una route figlia ha un’azione willTransition, non necessariamente risalirà)
Penso che avrai difficoltà a farlo perfettamente. Ember si aspetta di avere il pieno controllo del rendering, quindi cercare di agganciarsi a punti arbitrari sarà difficile e potrebbe causare problemi (a seconda di cosa stai cercando di fare).
Ovviamente non so qual è il tuo obiettivo finale… quindi forse il problema è giustificato. In tal caso: sentiti libero di ignorarmi
(naturalmente, se volessi aprire un argomento Dev sul problema che stai cercando di risolvere, sarei felice di dare un’occhiata)
Felice di essere esplicito dato che il codice è open source:
Sto lavorando con un provider di annunci di terze parti che ha una funzione di reset della pagina pubblicitaria in javascript che deve essere eseguita prima che vengano attivati gli annunci della nuova pagina.
Qualsiasi miglioramento è benvenuto e l’ho già implementato nella Topic List con il codice di Johani. (in un PR aperto).
Ma questo ha lasciato il Topic… Proverò il tuo suggerimento la prossima volta e lo adotterò in entrambi i casi se ciò migliorerà ulteriormente le cose.
Ah capisco, quindi non stai modificando il DOM direttamente
In tal caso, spero che routeWillChange funzioni: dovrebbe sicuramente attivarsi prima che venga renderizzata la prossima route.
L’avvertenza è che… nel caso di cose come i reindirizzamenti, potrebbe attivarsi due volte. O potrebbe attivarsi, e poi la transizione finisce per essere interrotta. Ma forse va bene in questo caso.