Декораторы @ViewChild
и @ViewChildren
предоставляют способ доступа и управления элементами DOM, директивами и компонентами. Мы можем использовать эти декораторы для доступа к дочернему компоненту и его различным свойствам в родительском компоненте.
@ViewChild
@ViewChild
используется для получения ссылки на элемент DOM, отображаемый внутри компонента angular. Он всегда возвращает первый соответствующий элемент из DOM.
В представлении, то есть в HTML-файле, мы можем определить ссылочную переменную шаблона, используя # (Hash). В приведенном ниже коде #firstName — это ссылочная переменная шаблона.
<h1 #firstName > View Child </h1>
мы можем использовать декоратор @viewchild()
в файле компонента (.ts), как показано ниже:
@ViewChild('firstName') heading : ElementRef;
Пример —
<div> <h1 #highlight>Lorem Ipsum</h1> <h3 #highlight> "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..." </h3> </div>
Здесь #highlight используется как ссылочная переменная шаблона на ‹h1› и ‹h3›.
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; @Component({ selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.css'] }) export class HomeComponent implements OnInit { @ViewChild('highlight') Marker!: ElementRef; constructor(private router: Router, private route: ActivatedRoute) { } ngOnInit(): void { } ngAfterViewInit() { this.Marker.nativeElement.style.color = 'Red' } }
Здесь мы получаем доступ к локальной ссылке, т. е. меняем цвет заголовка на красный, обращаясь к его элементам из DOM. мы используем метод ловушки жизненного цикла ngAfterViewInit, который будет вызываться при инициализации элементов.
Здесь мы видим, что заголовок изменился на красный цвет. Но #highlight задается для двух заголовков, то есть ‹h1› и ‹h3›, но цвет первого заголовка изменился, потому что @ViewChild возвращает первый соответствующий элемент из DOM.
@ViewChildren
@ViewChildren
предоставляют способ доступа и управления элементами DOM, директивами, компонентами списка элементов. Он возвращает список элементов из шаблона в компонент.
<div> <h1 #highlight>Lorem Ipsum</h1> <h3 #highlight> "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..." </h3> </div>
Здесь он применяет манипуляцию ко всем элементам, где используется #highlight. В приведенном выше коде мы используем #highlight для ‹h1› и ‹h3›. Итак, он изменил цвет для обоих заголовков.
import { Component, ElementRef, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; @Component({ selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.css'] }) export class HomeComponent implements OnInit { @ViewChildren('highlight') Marker!: QueryList<any>; constructor(private router: Router, private route: ActivatedRoute) { } ngOnInit(): void { } ngAfterViewInit() { this.Marker.forEach(marker =>{ marker.nativeElement.style.color = 'Red' }) } }