В предыдущем учебнике я показал, как настроить серверную и клиентскую части Discourse для обработки запросов.
Теперь мы рекомендуем вам ознакомиться с документацией по компонентам Ember: Introducing Components - Components - Ember Guides
Перед созданием компонента проверьте UI kit с общими компонентами, хелперами и модификаторами; большинство распространённых элементов управления уже существуют там.
Старый учебник
В этом учебнике я создам новый Ember Component как способ обернуть сторонний JavaScript. Это будет похоже на видео на YouTube, которое я снял некоторое время назад и которое, возможно, окажется полезным, только на этот раз речь пойдёт конкретно о Discourse и о том, как мы организуем файлы в нашем проекте.
Зачем нужны компоненты?
Handlebars — это довольно простой и привлекательный язык. Это обычный HTML с некоторыми динамическими частями. Его легко выучить, и он отлично подходит для повышения производительности, но не так хорош для повторного использования кода. Если вы разрабатываете большое приложение, такое как Discourse, вы обнаружите, что хотите повторно использовать одни и те же вещи снова и снова.
Компоненты — это решение Ember для этой проблемы. Давайте создадим компонент, который будет отображать наш снек более красиво.
Создание нового компонента
В имени компонента должен быть дефис. Я выберу fancy-snack в качестве имени для этого. Давайте создадим наш шаблон:
app/assets/javascripts/admin/templates/components/fancy-snack.hbs
<div class="fancy-snack-title">
<h1>{{snack.name}}</h1>
</div>
<div class="fancy-snack-description">
<p>{{snack.description}}</p>
</div>
Теперь, чтобы использовать наш компонент, мы заменим наш существующий шаблон admin/snack на этот:
app/assets/javascripts/admin/templates/snack.hbs
{{fancy-snack snack=model}}
Теперь мы можем повторно использовать наш компонент fancy-snack в любом другом шаблоне, просто передавая модель, как требуется.
Добавление пользовательского кода JavaScript
Помимо возможности повторного использования, компоненты в Ember отлично подходят для безопасного добавления пользовательского JavaScript, jQuery и другого внешнего кода. Они дают вам контроль над тем, когда компонент вставляется в страницу, и когда он удаляется. Для этого мы определяем Ember.Component с некоторым кодом:
app/assets/javascripts/admin/components/fancy-snack.js
export default Ember.Component.extend({
didInsertElement() {
this._super();
this.$().animate({ backgroundColor: "yellow" }, 2000);
},
willDestroyElement() {
this._super();
this.$().stop();
},
});
Если вы добавите указанный выше код и обновите страницу, вы увидите, что у нашего снека есть анимация медленно затухающего жёлтого фона.
Давайте разберёмся, что здесь происходит:
-
Когда компонент рендерится на странице, он вызывает
didInsertElement -
Первая строка в
didInsertElement(иwillDestroyElement) — этоthis._super(), что необходимо, потому что мы наследуем Ember.Component. -
Анимация выполняется с помощью функции animate из jQuery.
-
Наконец, анимация отменяется в хуке
willDestroyElement, который вызывается, когда компонент удаляется со страницы.
Вы можете задаться вопросом, почему нас вообще волнует willDestroyElement; причина в том, что в долгоживущем приложении на JavaScript, таком как Discourse, важно наводить порядок за собой, чтобы не допустить утечки памяти или оставления процессов работающими. В данном случае мы останавливаем анимацию, что сообщает таймерам jQuery, что им больше не нужно срабатывать, так как компонент больше не виден на странице.
Куда двигаться дальше
Финальный учебник в этой серии посвящён автоматизированному тестированию.
Этот документ находится под контролем версий — предложите изменения на github.