<h1 class="w-title __w-first">Первое диалоговое окно</h1>

<h2 class="w-subtitle">Создание alert-диалогового окна</h2>

<p>Во всех контроллерах после установки ember-dialog появляется свойство `dialog`, которое является ссылкой на сервис диалоговых окон - через который создаются все диалоговые окна.</p>

<p>Чтобы создать наше первое диалоговое окно давайте создадим контроллер, роут и шаблон. Для этого перейдите в корень вашего проекта и запустите команды:</p>

<pre data-src="examples/tutorial/creating/generate-things.bash"></pre>

<p>Ember создаст для вас роут, шаблон и контроллер. Давайте теперь откроем созданный нами контроллер (он должен находиться здесь: <code>app/controllers/example.js</code>) и внесем в него следующие изменения:</p>

<pre data-src="examples/tutorial/creating/controller-1.javascript" data-line="4-7" class="line-numbers"></pre>

<p>При заходе на url <code>http://127.0.0.1:4200/example</code> вы увидите дефолтное alert окно с текстом "Hello, Vladimir Milkov". Выполнение js кода было приостановлено до тех пор пока окно не будет закрыто. Выглядит окно так (ну вы и сами знаете ;)):</p>

<div style="text-align: center; overflow: hidden;"><img src="assets/default-alert.png"></div>

<p>Чтобы создать ember-dialog модальное окно нужно изменить код следующим образом:</p>

<pre data-src="examples/tutorial/creating/controller-2.javascript" data-line="7" class="line-numbers"></pre>

<p>Вы увидите следующее:</p>

<div style="text-align: center; overflow: hidden;"><img src="assets/dialog-alert.png"></div>

<p>Попробуйте сами: <a class="w-link w-link__pseudo" onclick={{action "simpleAlert"}}>показать простой alert</a>, <a class="w-link w-link__pseudo" onclick={{action "dialogAlert"}}>показать диалоговое окно с лейаутом alert</a>.</p>

<h2 class="w-subtitle">Создание confirm диалогового окна</h2>

<p>Ключевым типом диалоговых окон в большинстве проектов является confirm (с двумя кнопками). Такие окна также могут быть созданы из контроллера. Любой метод создающий окно диалогового менеджера возвращает <code>Promise</code> объект, который становится выполненым при закрытии окна. В случае с alert промис на закрытие всего резолвится, но в случае confirm, промис может и зарежектиться. Давайте ближе к коду:</p>

<pre data-src="examples/tutorial/creating/controller-3.javascript"></pre>

<p><button class="w-btn" onclick={{action "confirmDeletion"}}>Жми сюда</button> чтобы посмотреть результат отработки примера выше.</p>


<h2 class="w-subtitle">Использование шаблонов</h2>

<p>Тело диалогового окна может быть передано прямо при создании, следующим образом:</p>

<pre data-src="examples/tutorial/creating/controller-5.javascript"></pre>

<p>Но в крупных приложениях сообщения типа alert или confirm в разных местах программы одни и те же, и чтобы не плодить дубликаты можно текст сообщения вынести в отдельный шаблон и указывать вместо него путь.</p>

<p>К примеру пример выше можно переделать следующим образом. Создать шаблон `app/templates/messages/alert-error.hbs` и использовать его для показа в диалоговом окне в различных местах программы.</p>

<pre data-src="examples/tutorial/creating/controller-4.javascript"></pre>

<p>Хорошей практикой для своих проектов я выбрал использование специальной директории для шаблонов-сообщений: <code>/messages/</code>. Рекомендую вам поступить так же.</p>


<h2 class="w-subtitle">Прокидывание данных в диалоговое окно</h2>

<p>Любой метод для создания диалогового окна принимает 3 аргумента: шаблон, контекст, опции (исключанием является лишь метод <code>show</code>, который принимает также layout).</p>

<p><b>Шаблон</b> &mdash; путь до шаблона или предкомпилированный шаблон, который нужно вывести в теле диалогового окна.</p>

<p><b>Контекст</b> &mdash; объект с данными, он записывается в специальное свойство объекта диалогового окна - contextObject и может быть использован для показа данных в шаблоне.</p>

<p><b>Опции</b> &mdash; хеш влияющий на поведение диалогового окна, им оно расширяется. Ключи этого хеша неспосредственно доступны в шаблоне.</p>

<p>Из следующего примера должно стать ясно, что к чему ;)</p>

<pre data-src="examples/tutorial/creating/controller-6.javascript"></pre>


<h2 class="w-subtitle">Контроль закрытия</h2>

<p>Порой требуется контролировать закрытие модального окна программно. Наиболее частым случаем является диалоговое окно содержащее некую форму (про формы - {{#link-to 'cookbook.working-with-forms' class='w-link'}}отдельная история{{/link-to}}), при закрытии окна нужно создавать определенную сущность по данным формы. Но данные могут быть не валидными и в таком случае закрывать окно не нужно. Как предотвратить закрытие окна? Ранее при создании окна мы получали Promise по закрытию которого могли производить те или иные действия, т.е. постфактум. Итак для того чтобы запретить закрытие диалогового окна мы должны переопределить интересующий нас action у context отвечающий за его закрытие: accept и decline. Первым аргументом в action приходит presenter (инстанс компонента диалогового окна), у которого определены одноименные методы. Вот пример из которого все должно стать ясно.</p>

<pre data-src="examples/tutorial/creating/controller-7.javascript"></pre>

<p><button class="w-btn" onclick={{action "showDialog"}}>Проверьте сами</button></p>

<p>Но что делать если в контроллере используются несколько диалоговых окон? Нужно задать имя обработчка закрытия для каждого диалогового окна, как это сделать можете почитать на странице {{#link-to 'tutorial.interrupt-closing'}}{{t "tutorial.interrupt_closing"}}{{/link-to}}.</p>
