Это может быть полезно, если бы строка Показать x новых или обновлённых тем оставалась зафиксированной в верхней части под заголовком, чтобы вы сразу видели её при прокрутке списка тем. При клике на эту строку страница будет прокручиваться к началу для загрузки новых или обновлённых тем.
Вторая часть (JS) должна быть функцией для перехода в начало страницы или прокрутки к началу, но я не знаю, как это сделать или какой способ будет лучшим.
Я нашёл этот участок в шаблонах discovery/topics.hbs и discovery/categories.hbs. Если изменить <a href на <a href="/", это может сработать (не уверен, я не пробовал), но в этом случае при каждом клике будет происходить полная перезагрузка страницы, как при клике на логотип.
Да, добавление URL вызовет навигацию, так как нет логики для перехвата события.
Ссылка вызывает действие Ember. Все действия в Discourse расширяемы. Таким образом, они работают как хуки кастомизации. Так как же изменить действие? Давайте сначала посмотрим, что оно делает.
Ищите на GitHub или локально по имени действия. Действия всегда определяются в JS-файлах и упоминаются в Handlebars. Нам нужно увидеть определение, поэтому сузим поиск до JS-файлов.
Итак, мы закончили? Нет. Это ломает Discourse, потому что вы полностью переопределяете действие. При клике на ссылку теперь будет происходить прокрутка к элементу list-controls, но новые темы не загрузятся. Почему? Потому что код из ядра больше не выполняется. Имеется в виду вот этот код:
Так как это исправить? С помощью одной простой строки:
this._super(...arguments);
Вам не нужно копировать код из ядра, если вы просто хотите добавить что-то к нему. Выполните свою задачу, затем добавьте эту строку. Всё, что она делает, — гарантирует, что код из ядра будет применён.
Если вы протестируете это, то увидите, что почти всё работает отлично, кроме одного… заголовок перекрывает list-controls. Почему? Потому что заголовок установлен как sticky.
Это можно исправить несколькими способами на JS — рассчитать высоту, получить смещение, импортировать вспомогательный метод из Discourse и т.д. Я не буду углубляться в эти варианты.
Самый простой способ — использовать CSS со свойством scroll-margin-top, о котором можно прочитать здесь.
По-русски: при клике на ссылку прокрутка должна остановиться на верхней части list-controls минус удвоенная высота заголовка, чтобы не было перекрытия и оставался небольшой отступ снизу.
Спасибо, @Johani! Это очень помогло мне, и я, кажется, наконец-то понял многое. Мне очень нравятся ваши подробные ответы, потому что из них можно многому научиться: как всё устроено и, конечно же, как это работает. Ещё раз спасибо!