1. Как создать приложение
Установка CLI
Создание нового проекта
Либо webstorm сам может запустить сборку проекта
2. Обзор всех папок и файлов
В базовом приложении имеются несколько основных сущностей, которые влияют на работу приложения:
tsconfig
поделён на несколько файлов, в которых отдельно настраивается общее поведение, работа приложения и тесты- в
angular.json
находятся настройки компиляции ангуляра, указаны пути, полмифилы и все остальные специфики main.ts
иindex.html
- два основных корневых файлаenvironments
- хранит в себе настройки окружения
Конкретно в папке с компонентом располагается всего две сущности - component и module. Первый относится полностью к самому отображаемому компоненту - логика операций, отображение, стили. Второй относится к настройке модульной системы ангуляра
3. Передача параметров из компонентов
Стартовая точка приложения
main.ts
В модуле мы определяем метаданные и определённые структурные моменты компонента
app > app.module.ts
В самом компоненте мы указываем имя компонента, которое будет использоваться для добавления компонента в шаблоны, ссылки на шаблон и стили компонента
app > app.component.ts
И уже таким образом вставляется имя селектора в другой шаблон, чтобы добавить компонент
index.html
4. Создание своего компонента
Создаём дочерний компонент и указываем все импорты в него других файлов
app > post > post.component.ts
app > post > post.component.html
Далее нужно задекларировать дочерний компонент в компоненте родителя
app > app.component.ts
И теперь дочерний компонент можно использовать внутри родительского
app > app.component.html
5. Создание компонента с Angular CLI
Полная команда и сокращённая команда, а так же мы можем отключить добавление тестов
В итоге мы получим папку с компонентом, бойлерплейт и компонент добавиться в зависимости корневого компонента
6. Шаблоны и стили
Так же можно создавать шаблоны прямо в декораторе без вынесения его в отдельный файл.
Такой подход стоит использовать, если компонент очень маленький
app > button > button.component.ts
7. Интерполяция
Чтобы поместить в шаблон динамические значения, мы можем воспользоваться интерполяцией {{ значение }}
, внутри которой передать поля класса компонента
app > app.component.ts
app > app.component.html
8. Что такое bindings
Так же если мы привязываем какой-то атрибут к динамическим данным (например, класс, который будет меняться (мобильный адаптив), или ссылка src
будет меняться), то вместо использования интерполяции {{ }}
предпочтительнее оборачивать сам атрибут в [атрибут]='переменная'
квадратные скобки
Такой подход используется, так как он обеспечивает более оптимизированную смену значений в html
Конкретно тут связывание данных происходит от TS в HTML
app > app.component.ts
app > app.component.html
9. Как работает Event Bindings
Далее нужно будет познакомиться с концепцией, когда мы связываем данные из HTML в TS
Для связывания через ивенты используется конструкция (click)='onInput($event)'
, где мы оборачиваем событие в круглые скобки ()
, а для того, чтобы передать сам ивент в метод, используем $event
. Ивент внутри методов нужно типизировать через использование дженерика (<HTMLInputElement>event.target).value
, где мы опишем чем является элемент ивента
Так же есть уточняющие события, как например, если мы будем использоваться ивент keydown
, то к нему через точку можно приписать enter
, что будет вызывать срабатывание ивента только при нажатии enter
Так же мы можем сократить запись передачи ивента, если передадим ссылку на имя компонента через #myInput
. Такая ссылка позволит сразу воспользоваться myInput.value
и передать внутрь метода просто конечное значение текста
app > app.component.ts
app > app.component.html
10. 2 Way Binding
Бывают ситуации, когда нужно данные сначала передать из TS в HTML и чтобы пользователь имел возможность эти данные менять и обратно передавать в приложение
Для этого мы можем реализовать двустороннее связывание либо таким классическим образом:
app > app.component.ts
app > app.component.html
Либо можно воспользоваться модулем форм, который нужно добавить как импорт в корневой компонент приложения
app > app.module.ts
А затем воспользоваться записью двойного связывания [()]
, в которую и вложить ngModel
, который будет сам отвечать за связывание данных
app > app.component.html
11. Директива ngStyle
Директивы - это определённые атрибуты, которые позволяют управлять поведением различных HTML элементов
Конкретно директива [ngStyle]
всегда связывается с данными из TS. Данная директива используется для создания динамических стилей, так как она в себя может принимать инлайн-стили и логику JS
app > app.component.ts
app > app.component.html
12. Динамические классы с ngClass
У нас есть два способа добавлять классы динамически:
[ngClass]
- принимает в себя объект, где ключом выступает нужный класс, а свойством условие, которое этот класс будет активировать[class.нужный_класс]
- будет навешиваться нужный класс, если будет удовлетворять условию
app > app.component.html
13. Отображение по условию с ngIf else
В ангуляре присутствуют структурные директивы, которые позволяют изменять структуру HTML-шаблона
Все структурные директивы начинаются со звёздочки *
(как и связывание в одну или другую сторону через []
или ()
)
Самый простой способ организовать отрисовку по условию - это воспользоваться директивой *ngIf
, в которую мы передаём условие (любое, которое поддерживает JS)
app > app.component.html
И сейчас объект реально удаляется из вёрстки, а не просто скрывается
Такой способ не самый эффективный, так как мы два раза проверяем условие
Но, чтобы обозначить условие если, нужно воспользоваться переменной, которая будет ссылаться на конечный нужный элемент.
#переменная
обозначает элемент, который хранит данный блок вёрстки.
Внутрь ng-template
помещаем тот код, который нужно отображать в противном случае и вкладываем в него переменную, которую мы обозначили в условии в else
app > app.component.html
14. Директива ngSwitch
Директива ngSwitch
позволяет реализовать switch-case отображение элементов на странице. *ngSwitchCase
позволяет определить элемент, который отобразится, а *ngSwitchDefault
покажет, если ни один элемент не будет подпадать под условие
app > app.component.html
15. Циклы с ngFor
Так же мы имеем структурную директиву *ngFor
, которая позволяет проитерировать массив и вывести элементы в цикле
Первым делом создадим объекты, которые нужно будет проитерировать
app > app.component.ts
Далее внутри директивы нам нужно просто использовать итерацию через for-of
и через интерполяцию вывести по имени переменной объекты на странице. Если нам нужен будет индекс в итерации, то мы можем через ;
присвоить переменной зарезервированное имя index
.
Во втором примере показан вывод вложенного массива
`app > app.component.html
16. Что такое pipes
Пайпы представляют собой определённые форматтеры тех данных, которые мы передаём в интерполяции. Добавлять пайпы можно через |
. Конкретно пайп date
позволяет настроить выходной формат даты, а uppercase
переводит всё в верхний регистр
`app > app.component.html