Отладка открытия окон и панелей в Wasaby

Окно закрывается, не понимаю почему

Ошибка: Открыто стековое окно, при открытии еще одного окна родительское окно закрывается.

  1. Определяем, с каким типом окна работаем, в нашем случае это будет стек. Ставим точку в elementDestroyed в файле "StackController" и смотрим, что происходит: По стеку видим, что в закрытие пришли по событию деактивации. Это значит, что сфокусировался какой-то контрол, который с нашим окном не связан по parent'ам или opener'ам. Т.е., скорее всего, ошибка в том, что новому окну задают неправильный opener.
    В случаях когда не все так очевидно, можем посмотреть, куда конкретно ушел фокус. "Events.js" это позволяет сделать.
  2. Ставим точку в elementCreated, проверяем конфиг второго окна (открываем его еще раз), после открытия которого повторяется наша ошибка: Опция opener задана, но теперь проверим, какой именно контрол указан.
    Пытаемся найти в DOM его контнейнер по кнопке "Reveal in Elements panel".
    В итоге видим: Выделен BODY. Это значит, что контейнера, который мы искали, в DOM нет. Смотрим состояние _destroyed у контрола, оказывается он уже задестроен → связь по parent/opener потеряна → ошибка найдена.

P.S. На самом деле задестроенные контролы редко передают в опенер. Зачастую проблема в том, что отдают контрол, который не позволяет установить логическую связь между окнами (создан не в окнах, нет parent'ов и т.п.). Важно проверить значение опции, а не ее наличие.

Неправильно позиционируется окно

Ошибка: Открываю диалоговое окно, оно позиционируется не по центру страницы + едет верстка.

  1. Используется диалоговое окно, значит нам понадобится DialogController. Ставим точку в elementCreated, проверяем конфигурацию: На первый взгляд все правильно, проваливаемся по F11 и ищем, где заполняется item.position (вызывается метод getPosition от стратегии).
  2. Далее видим, что для правильного позиционирования окна по центру страницы контроллер вычисляет размеры этого окна. Опять же, похоже на правду.
  3. Далее мы видим, что в getPosition отдаются размеры страницы. И тут уже заметна явная проблема — высота страницы 0px. Смотрим верстку и видим, что с BODY что-то пошло не так: Проблема в том, что на BODY не задан размер.
  4. Прописываем размер, проверяем:

Ошибка поправлена, все работает.

Отладка в режиме совместимости

Что происходит при открытии панели/окна через action открытия на VDOM странице?

После вызова метода execute нас интересует метод _createComponent в модуле SBIS3.CONTROLS/Action/Mixin/DialogMixin.

isNewEnvironment() === true говорит нам о том, что мы находимся на VDOM странице и будем открывать новые окна со старыми шаблонами. Далее в строках 148-159 идет определение того, какое именно окно мы будем открывать: Stack, Sticky или Dialog. В этом участке проверяем, что открывается нужный контрол, соответствующий решаемым задачам. Поведение указанных контролов описано в документации.

После загрузки указанных модулей и слоев совместимости вызывается метод showDialog() модуля Controls/Popup/Opener/BaseOpener. Открытие любых окон и панелей, через какой бы action не открывалось окно, проходит через BaseOpener.showDialog. В методе также идет проверка на окружение, и в нашем случае вызывается метод _prepareConfigForOldTemplate, который вставляет слой совместимости между новым попапом и старым шаблоном.

Попадая в строку 171 в переменной cfg мы имеем конечный конфиг, с которым будет открываться окно. Здесь мы проверяем, что конфигурация соответствует той, что отдавалась в метод открытия; опции диалога соответствуют api новых окон.

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

Если в ходе отладки ошибки возникли какие-либо вопросы по слою совместимости, то оформляем их в группе Wasaby Framework в разделе обсуждения, прикладывая скрины конфигурации контрола, через который открывается окно и конечной конфигурации, которая попадает в метод show.

О полноте инструкции

Инструкция будет дополняться типовыми ошибками и сценариями их отладки.