Ich habe festgestellt, dass dieser Fehler auch als leicht beschädigte Einträge in der Browserhistorie auftritt, was ich für ein schwerwiegenderes Problem halte. Genauer gesagt wird einer alten URL ein neuer Titel zugewiesen, wenn die Navigation von JS gehandhabt wird. Dies geschieht so ziemlich immer in Firefox, ist aber in Chrome ziemlich selten (ich habe bisher einen Fall gefunden: Wechsel von /top zu einem Thema).
@sam hat Recht, dass dies durch die Reihenfolge der Operationen verursacht wird, in der URL und Titel geändert werden. Ich wünschte, es gäbe irgendwo eine Art Leitfaden mit Best Practices, der die richtige Reihenfolge angibt: Aktualisieren Sie den Titel immer nachdem Sie die history-API verwendet haben.
Ich habe versucht, einige Debugging-Arbeiten durchzuführen (und ich möchte im Voraus sagen, dass ich ziemlich abgeneigt bin, ein mittelgroßes, npm-nahes Projekt zu erstellen). Anfangs habe ich diesen Code für eine kleine Erkundung verwendet:
Es hat sich tatsächlich gezeigt, dass es fast immer eine Titeländerung unmittelbar vor der history-API-Operation gibt. Leider war das nicht hilfreicher: Die Zuordnung dessen, was zur Laufzeit geschieht, zum Quellcode war ziemlich schwierig – die interessierenden Operationen sind ziemlich verstreut, der Aufrufstapel war irreführend, da die Ausführung bereits an die Ember-Ereignisschleife übergeben wurde, und im Allgemeinen war die Debugging-Erfahrung in Firefox ziemlich höllisch. Nachdem ich zu Chrome gewechselt war, war ich etwas erfolgreicher. Lange Rede, kurzer Sinn, soweit ich weiß, entscheidet Ember selbst, wann die URL aktualisiert wird. Auf der anderen Seite kann die Änderung des Titels von zwei Stellen aus initiiert werden: [1] und [2]
Nur letzteres wird jemals vor dem history-API-Aufruf ausgeführt. Der “gemeinsame Code-Vorfahre” von ihnen befindet sich hier:
// Run all the necessary enter/setup/exit hooks
this.setupContexts(newState, transition); // <- title change initiated here, by triggering `model.title:change` event
// Check if a redirect occurred in enter/setup
if (transition.isAborted) {
// TODO: cleaner way? distinguish b/w targetRouteInfos?
this.state!.routeInfos = this.currentRouteInfos!;
return Promise.reject(logAbort(transition));
}
this._updateURL(transition, newState); // <- url change initiated here
Interessanterweise ist „router.js die Routing-Microlib, die von Ember.js verwendet wird.“
Nun möchte ich die Handhabung des Problems an jemanden übergeben, der, im Gegensatz zu mir, entfernt mit dem discourse-Code vertraut ist.
Bearbeiten: Habe vergessen zu erwähnen: document.title wird von [1] ein- oder mehrmals nach (beiden) Änderungen [2] und der Änderung der URL durch die history-API geändert.