Темы перескакивают на неправильный пост

Если я, как другой конечный пользователь, правильно понял, это то же самое, с чем я сталкиваюсь довольно часто. Какая-то тема перезагружается, и на короткий миг, на один-два моргания глазом, форум показывает какой-то старый пост, а затем прыгает к границе последнего посещения. Это произошло со мной несколько минут назад, и я ожидал прыжка, но он перестал показывать старый пост.

Так что… Я не умею программировать, но это звучит как странная ошибка, похожая на тайм-аут — будто всё постоянно находится на грани состояния, и после очень короткого сбоя Discourse пытается угнаться за темпом и показывает всё, что в этот момент находится на экране.

Или даже не близко :joy:

1 лайк

Это очень похоже на то, что слайдер загрузки мешает функции блокировки.

Когда я включил «медленный» режим, я вижу, что вызывается lockon для фиксации поста на экране, но сам пост даже не отрендерен, поэтому позиционирование сильно смещено.

Весь класс LockOn — это своего рода костыль. В данном случае, возможно, вместо блокировки и кэширования позиции стоит сделать что-то другое? Может быть, есть механизм для вызова lockon позже, после того как экран уже будет заполнен отрендеренными темами?

6 лайков

Большое спасибо за чёткие шаги по воспроизведению проблемы @Don :pray:

Да, именно так! Здесь одновременно происходит две вещи:

  1. Служба ползунка загрузки должна удалить класс still-loading из тега body.
  2. LockOn должен прокрутить страницу к нужному месту.

Обе задачи были запланированы в части afterRender цикла выполнения Ember. Поскольку код «зафиксировать на» технически был запланирован первым, он выполнялся первым. В результате LockOn запускался, когда весь HTML постов уже был в DOM, но всё ещё имел свойство display: none. :grimacing:

Этот PR переместит удаление класса still-loading в часть «render» цикла выполнения. Это означает, что любой другой код, запланированный afterRender, будет выполняться только после того, как всё будет отрисовано и станет видимым:

Согласен! Я не хотел трогать его в рамках этого исправления ошибки, но думаю, нам стоит стремиться убрать все подобные костыли.

Судя по комментариям в файле, он был изначально добавлен (10 лет назад!) для противодействия функциям «восстановления прокрутки» браузеров. В наши дни мы используем history.scrollRestoration = false, чтобы отключить эту функцию браузера, поэтому, думаю, это делает большинство старых костылей избыточными.

Вероятно, лучше сначала протестировать такие чувствительные изменения через компонент темы, а если всё будет хорошо, затем объединить их с основным кодом. Я полагаю, что удаление LockOn исправит множество других пограничных случаев, связанных с позицией прокрутки темы. Постараюсь проверить это в ближайшие пару недель :technologist:

7 лайков