В этой статье мы расскажем, что такое контроллеры, когда их следует использовать, некоторый исторический контекст и как их роль может измениться в будущем. Особая благодарность Эдварду Фолкнеру из основной группы Framework за рецензирование и написание нескольких ключевых разделов!

Эта статья относится к Ember от 1.13 до 3.x. Изначально он был опубликован в Ember Times, что является одним из лучших способов быть в курсе лучших практик, прогресса и новых функций в Ember.

Что такое контроллер?

За кулисами основная задача контроллера - передавать данные другим частям приложения и служить местом для определения параметров запроса. В некотором смысле можно сказать, что Контроллер похож на Компонент плюс Сервис. Как и в случае с компонентом, существует шаблон, который может ссылаться на свойства и действия контроллера. Этот шаблон представляет собой hbs файл маршрута. Как и служба, существует только один экземпляр данного контроллера на время существования вашего приложения, и все, что вы установите для него, останется установленным. Также, как и у службы (и в отличие от компонента), нет хуков жизненного цикла DOM, таких как didInsertElement, и нет this.element. У каждого маршрута в Ember есть соответствующий контроллер, независимо от того, генерируете ли вы для него файл или нет.

Почему их называют Контроллерами?

На заре Ember одна из преобладающих архитектур для веб-приложений называлась MVC, Модель-Представление-Контроллер. Модель описывает структуру данных, представление - это то, что видит пользователь, а контроллер - это то, что принимает ввод и сообщает моделям и представлениям о действиях. Много лет назад мы говорили, что Ember - это интерфейсный фреймворк MVC. Однако архитектура MVC означает много разных вещей для множества разных людей, поэтому мы больше не говорим об Ember в терминах MVC при обучении новичков. Контроллеры в основном несут те же обязанности, что и на протяжении всей истории Ember, но по мере развития структуры наши представления о контроллерах изменились. Добавление компонентов изменило наши ментальные модели.

Когда мне следует использовать контроллеры?

В типичном приложении Ember Контроллер - единственное место, где можно определить параметры запроса URL. Параметры запроса URL-адреса - это часть URL-адреса после вопросительного знака, например https://emberjs.com?searchTerm=sloths. Параметры запроса - это способ сохранить информацию, которая должна сохраниться после обновления страницы или должна быть доступна в виде закладки, например, запроса формы.

Контроллеры также часто используются как дом для действий и свойств, которые могут быть переданы компонентам. В некотором смысле можно сказать, что контроллер может делать почти все, что может делать файл JavaScript компонента. Независимо от того, используете ли вы контроллеры для действий и свойств, это вопрос архитектуры. Например, в моих приложениях у меня есть правило, согласно которому функции, которые приводят к запросу POST, PATCH или DELETE к моему API, должны быть определены в контроллерах. Если мне нужно что-то изменить в связи с сервером, я всегда знаю, где искать. Нет ничего, что могло бы помешать мне позволить компонентам выполнять такие обязанности, кроме некоторой эмпирической мудрости.

Дополнительные сведения о параметрах компонентов, которые обрабатывают данные, см. В предыдущем вопросе читателей Times Эдварда Фолкнера « Плохо ли загружать данные в компоненты? »

Обязательно ли использовать контроллеры?

Тебе обязательно? Нет. Должен ли ты? да. Их использование считается лучшей практикой. Если ваше приложение не имеет параметров запроса, возможно, вам никогда не придется писать собственный код в контроллере. Однако с архитектурной точки зрения вы можете получить беспорядок, избегая контроллеров.

Для получения дополнительной информации о том, как контроллеры помогают поддерживать аккуратный и предсказуемый поток данных, см. Предыдущие ответы на вопросы читателей Джессики Джордан Что подразумевается под термином« данные вниз, действия вверх

Что плохого может случиться, если я не буду использовать контроллеры?

Давным-давно был слух и статья, в которых говорилось, что контроллеры уходят, и что люди должны стараться не использовать их, чтобы «защитить» свои приложения от будущего. Это был плохой совет. К сожалению, за этим последовало МНОГО разработчиков Ember, и те, кто не проявил осторожности, закончили с беспорядком. Я унаследовал такой беспорядок, и мне потребовалось много времени, чтобы раскопать его.

В лучшем случае, чтобы избежать контроллеров, некоторые люди определили компонент верхнего уровня для каждого маршрута, где они сохранили действия и свойства, которые обычно выполняются на контроллере. На самом деле это не дает никаких преимуществ по сравнению с хранением этой информации в контроллере. Это просто дает вам еще один уровень шаблонов, которые нужно поддерживать. Для разработчиков, которые не тщательно планировали этот тип потока данных, многие в конечном итоге использовали обработку данных в разрозненных компонентах, без рифмы или причины для компонентов, которые вызывают запросы API, по сравнению с теми, которые предназначены для отображения или интерактивности.

Есть ли альтернативные подходы к контроллерам?

Да, но они не очень широко используются. В какой-то момент произошла попытка сделать параметры запроса доступными вне контроллеров. В результате некоторые члены сообщества разработали надстройки, позволяющие разработчикам опробовать его. Например, посмотрите ember-component-routes.

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

Какое будущее у контроллеров?

Ember управляется сообществом, поэтому вы можете помочь решить будущее контроллеров! Лучший способ принять участие - написать RFC, написать Проблемы или прокомментировать те, которые написаны другими. Было бы здорово иметь на одну концепцию меньше для обучения новых людей! Однако любое успешное решение должно быть законченным.

RFC - это запрос комментариев, при котором Ember рассматривает предложения сообщества и основной группы. Кто угодно может написать один! Если вы хотите отслеживать статус возможных будущих изменений в Ember, прочтите открытые и объединенные RFC. Если вы находитесь на компьютере, этот сайт - хороший способ просмотреть объединенные RFC. Новые RFC - обычная тема для Ember.js Times, еженедельного блога Learning Team, и Ember Weekly, информационного бюллетеня сообщества.

Существует множество идей о том, как Ember может использовать (или не использовать) контроллеры в будущем, но до тех пор, пока не будет предложен, обсужден и принят RFC, нет смысла строить догадки. В настоящее время нет открытых / объединенных RFC, предлагающих внести изменения в контроллеры. Исторический контекст прошлых обсуждений см. В отклоненном RFC.

Как и в случае любой другой функции в Ember, если бы в контроллеры были внесены изменения, также был бы хорошо продуман путь обновления, такие вещи, как инструменты codemod и другие формы поддержки. Когда изменения, наконец, произойдут, они не станут сюрпризом. Объединенный RFC - это просто зеленый свет для будущей работы, а не показатель того, что функция / изменение будет добавлено в одночасье. Обычно RFC объединяются, а затем на их реализацию уходит много времени. Некоторые из наиболее успешных RFC содержат надстройки, демонстрирующие возможности, чтобы люди могли опробовать их быстрее. Наконец, Ember твердо придерживается семвера и тщательно осуждает его.

Короче, не беспокойтесь об этом. Используйте передовой опыт, и если у вас есть идеи, которыми можно поделиться, вы можете принять участие в RFC-процессе Ember. По вопросам о том, как участвовать в RFC, заходите на канал # dev-ember-learning на нашем сервере Discord.

Спасибо за прочтение! Пожалуйста, поделитесь любыми другими вопросами!