=====Создание нового компонента===== **Компонент Angular** - обособленная часть интерфейса со своей логикой, HTML-шаблоном и стилями, представленная в виде класса, объявлению которого предшествует декоратор ``@Component().`` ====Создать новый компонент с помощью ng generate==== ng generate component home ===сокращенная запись=== ng g c home ===создание компонента без тестов=== ng generate component --spec=false ====примера создания компонента Angula==== Начнем сразу с примера создания компонента Angular.\\ home.component.ts import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.scss'] }) export class HomeComponent implements OnInit { constructor() { } ngOnInit(): void { } } Для использования созданного компонента в приложении сначала его необходимо указать в модуле, в пределах которого он определен, в свойстве declarations. \\ app.module.ts import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { HomeComponent } from './home/home.component'; @NgModule({ declarations: [ AppComponent, HomeComponent, ], imports: [ BrowserModule, AppRoutingModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { } Инициализация компонента осуществляется через использование значения свойства selector в качестве элемента в нужном месте шаблона.\\ app.component.html
Свойства класса компонента могут использоваться для отображения данных в шаблоне. Для этого используется механизм интерполяции. А вызов методов может осуществляться при возникновении событий. ====Конфигурация компонента==== Параметры компонента задаются с помощью передаваемого декоратору конфигурационного объекта следующей структуры: * **selector** - уникальный для каждого компонента CSS-селектор, с помощью которого компонент инициализируется в шаблоне; * **template** - визуальная часть компонента, представленная HTML-разметкой в виде строки; * **templateUrl** - URL-адрес файла, содержащего HTML-разметку; * **styles** - стили, распространяемые только на HTML текущего компонента; * **styleUrls** - массив URL-адресов файлов стилей; * **inputs** - определяет массив входных свойств; * **outputs** - задает массив выходных свойств; * **animations** - описывает анимации компонента; * **encapsulation** - определяет с помощью перечисления ViewEncapsulation пределы распространения стилей; * **changeDetection** - устаналивает режим работы механизма отслеживания изменений; * **providers** - задает массив локальных в пределах компонента Angular Providers; * **viewProviders** - определяет Angular Providers, которые доступны не только текущему компоненту, но и всем его дочерним представлениям; * **interpolation** - переопределяет открывающий и закрывающие символы интерполяции; * **preserveWhitespaces** - логическое значение, если true - сохраняет в шаблоне все лишние символы пробела, в противном случае удаляет их (по умолчанию false).; Пары свойств ``template/templateUrl`` и ``styles/styleUrls`` вляются взаимоисключающими. Предпочтительными для использования при разработке являются ``templateUrl`` и styleUrls. При переопределении символов интерполяции свойству interpolation передается массив с двумя элементами, первый из которых задает открывающий символ, а второй - закрывающий символ. @Component({ ... interpolation: ['!!', '!!'] }) ====selector==== //вызов компонента с помощью тега// import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-car', template: `

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus, nesciunt.

` })
\\ //вызов с помощью аттрибута// import { Component, OnInit } from '@angular/core'; @Component({ selector: '[app-car]', template: `

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus, nesciunt.

` })
\\ //вызов в классе// import { Component, OnInit } from '@angular/core'; @Component({ selector: '.app-car', template: `

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus, nesciunt.

` })
====template==== С помощью свойства template. Шаблон представляет кусок разметки HTML с вкраплениями кода Angular. Фактически шаблон это и есть представление, которое увидит пользователь при работе с приложением. import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-car', template: `

Single Car

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus, nesciunt.

`, }) export class CarComponent implements OnInit { constructor() { } ngOnInit() { } }
====templateUrl==== Каждый компонент должен иметь один шаблон. Однако необязательно определять шаблон напрямую с помощью свойства template. Можно вынести шаблон во внешний файл с разметкой html, а для его подключения использовать свойство templateUrl. import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-car', templateUrl: './car.component.html', }) export class CarComponent implements OnInit { constructor() { } ngOnInit() { } } ====styles==== Стилизация компонента может производиться как с помощью установки стилей в самом компоненте, так и с помощью подключения внешних css-файлов. Для установки стилей в директиве @Component определено свойство styles: import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-car', template: `

Single Car

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus, nesciunt.

`, // styleUrls: ['./car.component.css'] styles: [` h2 { color: aqua; } `] }) export class CarComponent implements OnInit { constructor() { } ngOnInit() { } }
====Инкапсуляция стилей==== Под инкапсуляцией стилей компонента понимается определение пределов распространения его стилей на другие шаблоны.\\ \\ Правило инкапсуляции задается с помощью перечисления ``ViewEncapsulation``, который входит в состав модуля \\ \\ ''@angular/core'' и имеет следующие значения: * **ViewEncapsulation.Emulated** - используется по умолчанию и указывает, что стили действуют только в пределах текущего компонента; * **ViewEncapsulation.None** - объявленные для компонента стили распространяются на все приложение без ограничений; * **ViewEncapsulation.ShadowDom** - создает для компонента элемент ShadowRoot и инкапсулирует стили в нем. Пример использования ''ViewEncapsulation''. import {ViewEncapsulation} from '@angular/core'; @Component({ ... encapsulation: ViewEncapsulation.None }) ====Геттеры и сеттеры==== Геттерами и сеттерами называются методы Angular компонента, которые используются для модификации значений его свойств.\\ \\ //Getter// вызывается в момент обращения к свойству (в шаблоне или в других методах классах), setter - в момент присвоения ему значения, обычно это свойства с декоратором ''@Input()''. @Input() _name: string = null; get name(): string { return this._name || 'Unknown'; } Запись означает, что при обращении к свойству с именем name будет вызван одноименный метод с ключевым словом get.\\ \\ Setter создается с помощью set. Он не должен возвращать значений и обязательно принимает в качестве единственного аргумента исходное значение. @Component({ selector: 'contacts-list', template: `` }) export class ContactsListComponent { contactPerson: string; } @Component({ selector: 'contacts-item', template: `

{{name}}

` }) export class ContactsItemComponent { _name: string = null; @Input() set name(value: string) { this._name = value + '*'; } get name(): string { return this._name || 'Unknown'; } }
В компоненте ''ContactsItemComponent'' определено строковое свойство ''_name'', которое участвует в формировании name. Свойства, определенные в Angular компоненте с помощью сеттеров и геттеров, не должны дублироваться в "обычных" свойствах, поэтому в примере выше используется название с нижним подчеркиванием. В ''ContactsListComponent'' задается значение name компонента ''ContactsItemComponent''. Именно в этот момент вызывается метод ''set()'' и устанавливает значение в "Peter*".\\ \\ В самом компоненте после интерполяции вызывается метод ''get()'', который возвращает "Unknown", если _name равно null.\\ \\ То есть если бы в ContactsListComponent шаблон был , то значением name было бы "Unknown".