Non posso dire di aver trovato una soluzione ideale, ma ho capito qual era il problema per me.
Il problema si trova qui
https://github.com/discourse/Discourse-nav-links-component/blob/main/desktop/head_tag.html
Nello specifico, questa parte:
api.modifyClass("component:navigation-item", {
pluginId: "discourse-nav-links-component",
active: Ember.computed("contentFilterMode", "filterMode", function() {
let contentFilterMode = this.get("content").get("filterMode");
if (window.location.pathname === location) {
return contentFilterMode === filter;
} else {
return this._super(contentFilterMode, this.get("filterMode"));
}
})
});
Sembra che questo imposti lo stato “attivo” su ogni link di navigazione. Francamente, la logica di come decide e cosa siano tutte queste variabili mi è piuttosto oscura. Ma il problema è qui:
if (window.location.pathname === location) {
return contentFilterMode === filter;
} else {
return this._super(contentFilterMode, this.get("filterMode"));
}
Per me, questo controlla se l’URL della pagina è uguale alla posizione dell’URL della barra di navigazione e, in tal caso, restituisce il risultato di contentFilterMode === filter, entrambe le variabili sono un po’ poco chiare per me. Se la condizione fallisce, sembra che esegua semplicemente la logica normale per determinare se qualcosa debba essere contrassegnato come attivo (motivo per cui i miei link non personalizzati sembrano funzionare correttamente). Il problema è che, sebbene questo codice venga eseguito correttamente una volta per ogni link di navigazione, la variabile location sembra essere sempre “categories”, quindi l’istruzione if è sempre falsa per i link personalizzati. Inoltre, anche se correggo la variabile “location” sostituendola con this.get("content").href, anche il valore restituito è sempre falso perché la variabile filter è anch’essa sempre impostata su “categories”.
Normalmente farei una PR per risolvere questo problema, ma il problema principale mi sfugge ancora. Ho trovato una soluzione alternativa che funziona per me ma altera leggermente la funzionalità documentata di questo componente, quindi preferirei non fare una PR. Penso che ci saranno casi limite in cui non funzionerà, ad esempio se la tua homepage è impostata su /latest
api.modifyClass("component:navigation-item", {
pluginId: "discourse-nav-links-component",
active: Ember.computed("contentFilterMode", "filterMode", function() {
return window.location.pathname.includes(this.get("content").href);
})
});
In pratica, controlla solo se l’URL corrente include l’URL della barra di navigazione come sottostringa. Se sì, lo evidenzia.