Как создать полностраничный веб-сайт в Angular. Часть 4 (4)

Следуйте этим простым шагам, чтобы создать полнофункциональный веб-сайт, используя Angular.

Angular

Как создать полностраничный веб-сайт в Angular. Часть 1 (4)

Как создать полностраничный веб-сайт в Angular. Часть 2 (4)

Как создать полностраничный веб-сайт в Angular. Часть 3 (4)

Как создать полностраничный веб-сайт в Angular. Часть 4 (4)

12. Добавление пользовательской директивы

А теперь, самая интересная часть! В целом наш сайт работает, за исключением того факта, что наше фоновое изображение не ресайзится, заполняя все пространство браузера. Мы собираемся решить эту проблему, создав кастомную директиву, которая будет ресайзить наше изображение на всю высоту и ширину страницы.

CLI снова пойдет нам на пользу, так как мы можем использовать его для создания директивы. Мы сгенерируем директиву fullpage в каталоге app/shared/directives.

Сгенерируется базовая директива, которая выглядит так:

Сгенерированный селектор — appFullpage, кажется мне странным, поэтому я переименовал его в fullpage. Вы можете переименовать его на свое усмотрение.

Основное различие между компонентом и директивой состоит в том, что директива не имеет своего собственного шаблона; она отвечает за украшение или расширение существующего элемента. В нашем случае мы хотим, чтобы она взяла существующий элемент и разместила на все окно браузера.

13. Доступ к элементу

Чтобы изменить размер элемента, нам нужна ссылка на него, которую нам предоставляет ElementRef. Это даст нам доступ к элементу, объявленному в нашей директиве.

Скучные математические выражения! Мы создадим функцию resize, которая измеряет ширину и высоту нашего элемента, а также ширину и высоту окна, а затем пропорционально изменит размеры элемента. Основная идея заключается в том, чтобы сперва растянуть по меньшей ширине или высоте окна, а затем пропорционально масштабировать другое свойство.

14. Введение слушателей

Все это прекрасно, но как мы узнаем, когда изменять размер элемента? Мы хотим изменить размер нашего элемента, когда он только загрузился, и каждый раз при изменении размера окна.

Следующий вопрос: откуда мы знаем, когда происходят эти события? Angular предлагает отличный способ сделать это в виде HostListener. Добавляем метод с метаданными HostListener, где определяем событие, которое мы хотим прослушать, чтобы запустить код при возникновении этого события.

Мы используем window:resize, чтобы узнать, когда окно было изменено и load, когда окно загрузилось.

Это действительно потрясающий способ прикреплять методы к событиям DOM без прямого общения с DOM или написания наших слушателей вручную и, самое главное, не беспокоиться об уничтожении наших событий.

Чтобы добавить директиву в наше приложение, перейдем к файлу page.component.html и добавим атрибут fullpage к нашему изображению.

15. Оформляем элементы с помощью CSS

Оформим некоторые элементы с помощью CSS, чтобы они смотрелись красиво. Укажем что мы используем Flexbox для нашего макета и хотим, чтобы наш тег body скрывал любое переполнение (overflow).

Также обратите внимание, что мы создаем класс spacer, чтобы отправить логотип и кнопки на панель инструментов. У нас также есть классactive, который мы используем с routerLinkActive.

Наконец, мы используем псевдо-селектор :host для таргетинга компонента, на который нацелен наш CSS.

Интересная вещь с CSS заключается в том, что он определен на соответствующем уровне компонента. Стили в рамках приложения обычно входят в файл styles.css, каждый из которых соответствует конкретному стилю в соответствующих файлах CSS.

16. Смотрим свою работу

В первой части этой серии мы рассмотрели немало вопросов, но давайте рассмотрим, что мы сделали:

  • Мы использовали @angular/cli для генерации нового проекта
  • Мы установили @angular/material и @angular/animations через NPM
  • Мы добавили @angular/material и @angular/animations в наш Angular модуль
  • Мы создали PageComponent для представления страниц на нашем сайте
  • Мы создали ContentService для хранения контента нашего сайта
  • Мы создали маршруты, которые сопоставлялись со страницами на нашем сайте и передавались в кастомном data, чтобы помочь нам определить, на какой странице мы находимся
  • Мы добавили тулбар, связанный с каждой страницей с помощью routerLink, и создали кнопку для активной страницы с routerLinkActive
  • Мы создали директиву fullpage, чтобы изменить размер изображения в нашем PageComponent, и заполнить весь фон
  • Мы использовали HostListener для прослушивания событий DOM, чтобы знать, когда меняется размер элемента

Источник creativebloq.com