Angular — это фреймворк, построенный вокруг компонентной архитектуры. В рамках этого подхода приложения разделяются на независимые, повторно используемые блоки — компоненты. Каждый компонент управляет своей частью пользовательского интерфейса, имеет собственную логику и стили. Компоненты могут взаимодействовать друг с другом через механизмы ввода/вывода данных, что способствует созданию гибкой и масштабируемой структуры приложения.
Каждый компонент в Angular состоит из нескольких ключевых частей:
Пример базового компонента:
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'Angular Application';
}
Здесь:
selector — имя тега, который будет использоваться для
вставки компонента в шаблон.templateUrl — путь к файлу HTML, в котором находится
разметка компонента.styleUrls — массив путей к файлам CSS, которые будут
применяться к компоненту.Компоненты в Angular проходят через несколько этапов жизненного цикла, начиная с их создания и заканчивая уничтожением. Понимание этих этапов помогает эффективно управлять состоянием компонента и его зависимостями.
Пример использования жизненного цикла:
import { Component, OnInit, OnDestroy } from '@angular/core';
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
styleUrls: ['./example.component.css']
})
export class ExampleComponent implements OnInit, OnDestroy {
constructor() { }
ngOnInit(): void {
console.log('Component initialized');
}
ngOnDestroy(): void {
console.log('Component destroyed');
}
}
Компоненты могут обмениваться данными с помощью входных и выходных параметров.
Чтобы передать данные в компонент, используется декоратор
@Input. Это позволяет родительскому компоненту передавать
значения дочернему компоненту.
Пример:
// Родительский компонент
@Component({
selector: 'app-parent',
template: `<app-child [childData]="parentData"></app-child>`
})
export class ParentComponent {
parentData = 'Data from Parent';
}
// Дочерний компонент
@Component({
selector: 'app-child',
template: `<p>{{ childData }}</p>`
})
export class ChildComponent {
@Input() childData: string;
}
Для отправки данных от дочернего компонента к родительскому
используется декоратор @Output, который вместе с объектом
EventEmitter позволяет генерировать события.
Пример:
// Родительский компонент
@Component({
selector: 'app-parent',
template: `<app-child (childEvent)="handleChildEvent($event)"></app-child>`
})
export class ParentComponent {
handleChildEvent(event: string) {
console.log(event);
}
}
// Дочерний компонент
@Component({
selector: 'app-child',
template: `<button (click)="sendEvent()">Click Me</button>`
})
export class ChildComponent {
@Output() childEvent = new EventEmitter<string>();
sendEvent() {
this.childEvent.emit('Data from Child');
}
}
Angular приложения могут быть разделены на несколько модулей, каждый из которых может содержать компоненты, сервисы, директивы и другие элементы. Это помогает организовать приложение и облегчить масштабирование. Модуль, содержащий компоненты, может быть импортирован в другие модули, делая компоненты доступными для использования.
Пример структуры модуля с компонентами:
@NgModule({
declarations: [AppComponent, ChildComponent],
imports: [BrowserModule],
bootstrap: [AppComponent]
})
export class AppModule { }
Директивы и компоненты в Angular имеют схожую структуру, но компоненты всегда имеют шаблон, а директивы — нет. Директивы управляют поведением элементов, в то время как компоненты управляют структурой и представлением. Например, директива может изменять внешний вид элемента, а компонент — описывать его структуру и логику.
Пример создания директивы:
@Directive({
selector: '[appHighlight]'
})
export class HighlightDirective {
constructor(private el: ElementRef) {
el.nativeElement.style.backgroundColor = 'yellow';
}
}
Службы (сервисы) в Angular играют ключевую роль в архитектуре приложения, так как они предоставляют данные и бизнес-логику, которые могут быть использованы несколькими компонентами. Angular использует систему инъекции зависимостей для того, чтобы передавать экземпляры сервисов в компоненты.
Пример сервиса:
@Injectable({
providedIn: 'root',
})
export class DataService {
getData() {
return ['Angular', 'React', 'Vue'];
}
}
Компонент, использующий этот сервис:
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
styleUrls: ['./example.component.css']
})
export class ExampleComponent {
data: string[];
constructor(private dataService: DataService) {
this.data = this.dataService.getData();
}
}
Компонентная архитектура Angular позволяет создавать гибкие, масштабируемые и тестируемые приложения. Каждый компонент имеет свою ответственность, что упрощает работу с ним как в процессе разработки, так и в процессе тестирования и поддержки.