В Angular есть несколько способов записать и прочитать свойство родительского компонента из дочернего. Рассмотрим каждый из них.
1. Использование директивы @Input:
Директива @Input позволяет передавать значения из родительского компонента в дочерний компонент. Для этого в дочернем компоненте необходимо добавить свойство с декоратором @Input и задать ему имя, которое будет использоваться для передачи значения из родительского компонента.
Пример:
Родительский компонент:
import { Component } from '@angular/core'; @Component({ selector: 'app-parent', template: ` <app-child [parentProperty]="parentValue"></app-child>` }) export class ParentComponent { parentValue: number = 10; }
Дочерний компонент:
import { Component, Input } from '@angular/core'; @Component({ selector: 'app-child', template: ` <p>{{ childProperty }}</p>` }) export class ChildComponent { @Input() parentProperty: number; childProperty: number = 0; ngOnInit() { this.childProperty = this.parentProperty * 2; } }
2. Использование сервисов:
В Angular есть возможность передавать данные между компонентами с помощью сервисов. Создайте сервис, который будет содержать свойство с нужными данными и методы для его записи и чтения. Затем инъектируйте сервис в родительский и дочерний компоненты и используйте его методы для передачи и получения значений.
Пример:
Сервис:
import { Injectable } from '@angular/core'; @Injectable() export class DataService { parentValue: number = 10; }
Родительский компонент:
import { Component } from '@angular/core'; import { DataService } from './data.service'; @Component({ selector: 'app-parent', template: ` <app-child></app-child>` }) export class ParentComponent { constructor(private dataService: DataService) {} setParentValue(value: number) { this.dataService.parentValue = value; } }
Дочерний компонент:
import { Component } from '@angular/core'; import { DataService } from './data.service'; @Component({ selector: 'app-child', template: ` <p>{{ childProperty }}</p>` }) export class ChildComponent { childProperty: number = 0; constructor(private dataService: DataService) {} ngOnInit() { this.childProperty = this.dataService.parentValue * 2; } }
3. Использование родительского компонента как сервиса:
Если родительский компонент является родительским для дочернего в иерархии компонентов, то его можно использовать как сервис. В таком случае, свойство родительского компонента может быть доступно в дочернем компоненте без необходимости внедрения сервиса или использования директивы @Input.
Пример:
import { Component } from '@angular/core'; @Component({ selector: 'app-parent', template: ` <app-child></app-child>`, providers: [{ provide: ParentComponent, useExisting: forwardRef(() => ParentComponent) }] }) export class ParentComponent { parentValue: number = 10; }
import { Component } from '@angular/core'; @Component({ selector: 'app-child', template: ` <p>{{ childProperty }}</p>` }) export class ChildComponent { childProperty: number = 0; constructor(private parent: ParentComponent) {} ngOnInit() { this.childProperty = this.parent.parentValue * 2; } }
В итоге, в Angular есть несколько способов записать и прочитать свойство родительского компонента из дочернего. Выбор подходящего способа зависит от контекста и требований приложения.