Отладка контрола Controls/calendar:MonthList

Ошибки позиционирования положения скролла

Проблемы

  1. При инициализации календаря положение контента не соответствует установленному месяцу.
  2. При изменении опции position календарь позиционируется не на переданную дату.
  3. После каких либо действий календарь оказывается прокручен не на тот месяц который ожидает пользователь.

Отладка

Скролл может быть вызван сменой опции position. Обратите внимание, что если ссылка на объект с датой изменилась, то со стороны контрола будет предпринята попытка скролла к новому значению. Для того чтобы определить поменялись ли опции, воспользуемся расширение Wasaby Developer Tools. Для примера откроем раздел календаря на online.sbis.ru. Перемотаем список месяцев так, чтобы текущий месяц не был виден. В Wasaby Developer Tools откроем вкладку Profiler и нажмем кнопку REC. Далее нажимаем на кнопку с домиком в календаре. Останавливаем запись повторным нажатием на кнопку REC. На скриншоте мы видим, что компонент Controls/calendar:MonthList перерисовывался потому что изменились опции, в том числе и опция position.

Давайте посмотрим что произошло в родителях. Ближайшие родители это хоки, все что в них менялось это изменялась контентная опция. Нам это не интересно.

Ближайший компонент в шаблоне которого лежит MonthView это CoreUserCalendar/month:MonthCore. Если открыть его, то можно увидеть что именно он задает position беря значение из опции date. Аналогичным образом можно найти кто меняет опцию date.

При дальнейшей отладке советуем использовать точки логирования, т.к. точки останова могут повлиять на порядок выполнения различных событий.

Если используется двусторонний биндинг на опцию position, то дату может менять сам календарь. Чтобы проверить это, надо поставить точку логирования там, где Controls/calendar:MonthList вызывает _notify('positionChanged').

Если в контрол приходит дата которая ушла с событием positionChanged, то отдаем ошибку ответственному за контрол MonthList.

Если в контрол приходит новая дата, и вызвано это не событием из самого контрола, то проблема в прикладной логике. Как найти виновного описано выше.

Если следуя шагам выше кажется, что все нормально, то дальше следует выяснить кто виноват в неправильном позиционировании календаря. Controls/calendar:MonthList внутри использует списки. К новому положению может скроллировать как Controls/calendar:MonthList, так и список.

Проверим скролирует Controls/calendar:MonthList или кто-то другой. Для этого поставим точку логирования в месте вызова хелпера scrollToElement.

Если попадаем сюда, значит скроллирует Controls/calendar:MonthList, если нет, то скорее всего — список. В соответствии с этим надо передать ошибку либо ответственному за MonthList, либо ответственному за список.