Я не могу сказать, что нашел идеальное решение, но понял, в чём была проблема для меня.
Проблема находится здесь:
https://github.com/discourse/Discourse-nav-links-component/blob/main/desktop/head_tag.html
А именно в этой части:
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"));
}
})
});
Похоже, что этот код устанавливает свойство “active” для каждой ссылки навигации. Честно говоря, логика того, как он принимает решения и что означают все эти переменные, для меня довольно запутанна. Но проблема здесь:
if (window.location.pathname === location) {
return contentFilterMode === filter;
} else {
return this._super(contentFilterMode, this.get("filterMode"));
}
На мой взгляд, здесь проверяется, совпадает ли URL страницы с location (адресом) ссылки в навигационной панели, и если да, то возвращается результат выражения contentFilterMode === filter, при этом обе переменные для меня немного неясны. Если условие не выполняется, похоже, что просто запускается обычная логика определения того, должно ли что-то быть помечено как активное (поэтому мои нестандартные ссылки, кажется, работают нормально). Проблема в том, что, хотя этот код корректно выполняется один раз для каждой ссылки навигации, переменная location всегда, кажется, равна “categories”, поэтому условие if всегда ложно для пользовательских ссылок. Кроме того, даже если я исправлю переменную “location”, заменив её на this.get("content").href, возвращаемое значение также всегда будет ложным, потому что переменная filter также всегда установлена в значение “categories”.
Обычно я бы просто создал PR с исправлением, но истинная корневая проблема всё ещё ускользает от меня. Я придумал обходное решение, которое работает для меня, но немного меняет задокументированную функциональность этого компонента, поэтому я бы не хотел отправлять его в виде PR. Мне кажется, что будут пограничные случаи, когда оно не сработает, например, если ваша домашняя страница установлена как /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);
})
});
По сути, здесь просто проверяется, содержит ли текущий URL адрес ссылки в навигационной панели как подстроку. Если да, то она подсвечивается.