Hallo.
Wenn wir in Discourse die Seite wechseln, sind dies die offensichtlichen Schritte:
Wir klicken auf den Link.
Der aktuelle Inhalt verschwindet und der Ladebalken erscheint.
Die URL wird aktualisiert und der neue Inhalt erscheint.
Beim Wechsel von einer Seite zur Startseite ist dies etwas anders: Die URL wird auf die Startseite geändert, sobald der aktuelle Inhalt verschwindet, und nicht erst, wenn der neue Inhalt erscheint.
Mein Ziel ist es, ein Skript zu haben, das ausgeführt wird, sobald wir auf einen beliebigen Seitenlink in Discourse klicken. api.onPageChange ist in diesem Fall nicht geeignet, da der Code ungefähr zur gleichen Zeit ausgeführt wird, zu der der neue Seiteninhalt geladen wird.
Gibt es eine Discourse-Methode dafür? Ich habe die Event-Trigger durchsucht, konnte aber keinen finden, der dem entspricht, was ich brauche.
Aktuell gibt es in der Plugin-API keine Methode, die es ermöglicht, ein Skript vor einem Seitenübergang auszuführen, da dies meines Wissens nach bisher nicht vorgekommen ist.
Trotzdem kannst du die Aktion willTransition() in der Anwendungsroute nutzen.
In deinem Theme oder deiner Komponente würdest du etwas Ähnliches verwenden:
// Dies wird nach dem Übergang ausgeführt
api.onPageChange((url, title) => {
console.log("nach dem Übergang");
});
// Dies wird direkt vor dem Übergang ausgeführt
api.modifyClass("route:application", {
pluginId: "some-name",
actions: {
willTransition() {
// Zuerst den Kerncode ausführen
this._super(...arguments);
// Dann einige Arbeiten erledigen
console.log("vor dem Übergang");
// Du kannst auch so etwas tun, um zu sehen, welche Daten dir zur Verfügung stehen,
// wie zum Beispiel _router
console.log(this)
}
}
});
Ein paar Gründe, warum das möglicherweise nicht funktioniert:
Aktionen in einem Hash zu platzieren, ist eine alte Syntax, die wir in Discourse nicht mehr verwenden. Theoretisch sollte es funktionieren, aber die Interoperabilität mit der neuen Syntax ist möglicherweise nicht perfekt. Der moderne Weg wäre
Der übliche Haftungsausschluss für modifyClass gilt: Dies ist riskant und kann jederzeit fehlschlagen.
Ich glaube nicht, dass willTransition in allen Situationen auf der Anwendungsroute garantiert ausgelöst wird. (z. B. wenn eine untergeordnete Route eine willTransition-Aktion hat, wird sie nicht unbedingt nach oben weitergegeben.)
Ich denke, es wird schwierig sein, dies perfekt zu machen. Ember erwartet, die volle Kontrolle über das Rendern zu haben, daher wird es schwierig sein, an beliebigen Punkten anzuhaken, und kann Probleme verursachen (abhängig davon, was Sie zu tun versuchen).
Offensichtlich weiß ich nicht, was Ihr Endziel ist … also ist der Aufwand vielleicht gerechtfertigt. In diesem Fall können Sie mich gerne ignorieren
(Wenn Sie natürlich ein #dev-Thema zu dem Problem eröffnen möchten, das Sie lösen möchten, werde ich es mir gerne ansehen)
Gerne, ich bin explizit, da der Code Open Source ist:
Ich arbeite mit einem Drittanbieter-Werbeanbieter zusammen, und dieser hat eine Funktion zum Zurücksetzen der Werbeseite in JavaScript, die ausgeführt werden muss, bevor die Anzeigen der neuen Seite ausgelöst werden.
Jede Verbesserung ist willkommen, und ich habe dies bereits im Topic List mit Johani’s Code umgesetzt. (in einem offenen PR).
Aber das hat das Topic … Ich werde Ihren Vorschlag als nächstes ausprobieren und ihn in beiden Fällen übernehmen, wenn dies die Dinge weiter verbessert.
Ah, ich verstehe, Sie modifizieren also nicht direkt das DOM
In diesem Fall hoffe ich, dass routeWillChange funktionieren wird – es sollte sicherlich ausgelöst werden, bevor die nächste Route gerendert wird.
Der Vorbehalt ist, dass… im Falle von Dingen wie Weiterleitungen, es möglicherweise zweimal ausgelöst wird. Oder ausgelöst wird und dann der Übergang abgebrochen wird. Aber vielleicht ist das in diesem Fall in Ordnung.
Ja, hier bei Merefield Technology Towers gibt es keine unanständige direkte DOM-Manipulation.
Ja, ich werde den Dienst nutzen, dafür ist er da! Ich werde mit meinen Erfahrungen zurückmelden, da mich die Ergebnisse sicher auch andere interessieren könnten.