Отладка открытия окон и панелей в Wasaby
Окно закрывается, не понимаю почему
Ошибка: Открыто стековое окно, при открытии еще одного окна родительское окно закрывается.
- Определяем, с каким типом окна работаем, в нашем случае это будет стек. Ставим точку в
elementDestroyed
в файле "StackController" и смотрим, что происходит:По стеку видим, что в закрытие пришли по событию деактивации. Это значит, что сфокусировался какой-то контрол, который с нашим окном не связан по
parent
'ам илиopener
'ам. Т.е., скорее всего, ошибка в том, что новому окну задают неправильныйopener
.
В случаях когда не все так очевидно, можем посмотреть, куда конкретно ушел фокус. "Events.js" это позволяет сделать. - Ставим точку в
elementCreated
, проверяем конфиг второго окна (открываем его еще раз), после открытия которого повторяется наша ошибка:Опция
opener
задана, но теперь проверим, какой именно контрол указан.
Пытаемся найти вDOM
его контнейнер по кнопке "Reveal in Elements panel".
В итоге видим:Выделен
BODY
. Это значит, что контейнера, который мы искали, вDOM
нет. Смотрим состояние_destroyed
у контрола, оказывается он уже задестроен → связь поparent/opener
потеряна → ошибка найдена.
P.S. На самом деле задестроенные контролы редко передают в опенер. Зачастую проблема в том, что отдают контрол, который не позволяет установить логическую связь между окнами (создан не в окнах, нет parent
'ов и т.п.). Важно проверить значение опции, а не ее наличие.
Неправильно позиционируется окно
Ошибка: Открываю диалоговое окно, оно позиционируется не по центру страницы + едет верстка.
- Используется диалоговое окно, значит нам понадобится
DialogController
. Ставим точку вelementCreated
, проверяем конфигурацию:На первый взгляд все правильно, проваливаемся по F11 и ищем, где заполняется
item.position
(вызывается методgetPosition
от стратегии). - Далее видим, что для правильного позиционирования окна по центру страницы контроллер вычисляет размеры этого окна. Опять же, похоже на правду.
- Далее мы видим, что в
getPosition
отдаются размеры страницы. И тут уже заметна явная проблема — высота страницы 0px.Смотрим верстку и видим, что с
BODY
что-то пошло не так:Проблема в том, что на
BODY
не задан размер. - Прописываем размер, проверяем:
Ошибка поправлена, все работает.
Отладка в режиме совместимости
Что происходит при открытии панели/окна через 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
.
О полноте инструкции
Инструкция будет дополняться типовыми ошибками и сценариями их отладки.