В Angular существует несколько способов передачи данных от родительского к дочернему компоненту:
Родительский компонент:
<app-child [inputData]="parentData"></app-child>
parentData = 'Data from parent';
Дочерний компонент:
import { Input } from '@angular/core';
@Input() inputData: string;
Использование в дочернем шаблоне:
<p>Received data: {{ inputData }}</p>
Позволяют добавить логику при изменении входного значения:
private _inputData: string;
@Input()
set inputData(value: string) {
this._inputData = value;
console.log('Data changed:', value);
}
get inputData(): string {
return this._inputData;
}
import { Input, OnChanges, SimpleChanges } from '@angular/core';
ngOnChanges(changes: SimpleChanges) {
if (changes.inputData) {
console.log('Previous value:', changes.inputData.previousValue);
console.log('Current value:', changes.inputData.currentValue);
}
}
@Injectable({ providedIn: 'root' })
export class DataService {
private dataSubject = new BehaviorSubject<string>('');
data$ = this.dataSubject.asObservable();
setData(data: string) {
this.dataSubject.next(data);
}
}
constructor(private dataService: DataService) {}
sendData() {
this.dataService.setData(this.parentData);
}
Дочерний:
data: string;
constructor(private dataService: DataService) {
this.dataService.data$.subscribe(data => {
this.data = data;
});
}
Родительский компонент:
import { ViewChild } from '@angular/core';
import { ChildComponent } from './child.component';
@ViewChild(ChildComponent) childComponent: ChildComponent;
sendData() {
this.childComponent.receiveData(this.parentData);
}
Дочерний компонент:
receiveData(data: string) {
this.inputData = data;
}
Метод | Когда использовать | Плюсы | Минусы |
---|---|---|---|
Input-свойства | Простая передача данных | Простота, декларативность | Нет сложной логики |
Setter/ngOnChanges | Нужна реакция на изменения | Гибкость | Усложняет код |
Сервис | Обмен между несвязанными компонентами | Глобальный доступ | Сложнее отслеживать поток |
ViewChild | Прямой доступ к дочернему компоненту | Максимальный контроль | Нарушает инкапсуляцию |
<app-child [data]="data$ | async"></app-child>
@Input() data: string = 'default';
[( )]
) если можно обойтись Input@Input()
Правильная передача данных между компонентами - ключ к поддерживаемой архитектуре Angular-приложения.