Установите связь между родственными компонентами в Angular 11
В этой статье мы увидим, как мы можем передавать данные между одноуровневыми компонентами на клиентской машине.
В Angular мы делим нашу веб-страницу на несколько компонентов, и связь между этими компонентами образует древовидную структуру. Компонент может иметь родителя и несколько дочерних элементов. Тем не менее, у него также могут быть братья и сестры. В некоторых ситуациях нам нужно передавать данные между этими независимыми компонентами. Передача данных проста, и это делает наш код чище и читабельнее при работе над большим проектом.
Предварительные требования: NPM должен быть предварительно установлен.
Чтобы понять, как это работает, посмотрите на схему ниже:

- В случае пользовательского события мы можем выдать данные из одного компонента.
- Эти данные будут отправлены в родительский компонент.
- Родительский компонент может в дальнейшем передавать эти данные в виде входных данных другому дочернему компоненту.
- Это односторонняя передача, но мы можем использовать ее и в другом направлении, чтобы создать двусторонний канал связи.
В Angular мы можем добиться этого, используя встроенные функции:
- Декоратор @Output помогает передавать данные через объект EventEmitter<T>. Мы увидим его работу на примере.
- Родительский компонент будет захватывать данные как переменную $event. Он может использовать его в методе или передать другим способом.
- Наконец, декоратор @Input() использует переменную, и любой ввод через родителя будет сохранен в этой переменной.
Давайте рассмотрим все это на простом примере. В этом посте мы увидим простую веб-страницу, которая принимает ключевые слова в качестве пользовательского ввода в одном компоненте и отображает соответствующие строки в другом компоненте.
Сначала настроим среду:
- Установите угловой клиент. Запустите от имени администратора или используйте sudo в случае ошибок прав доступа.
npm i -g @angular/cli
- Когда angular CLI установлен, запустите новый проект, используя следующую команду:
ng new <project-name>
- Теперь протестируйте его, используя:
ng serve -o
- Если к целевой странице angular можно получить доступ по адресу http://localhost:4200, установка прошла успешно. Прежде чем двигаться дальше, очистите содержимое app.component.html.
- После этого сгенерируйте два новых компонента:
ng generate component search ng generate component table
- Вы увидите два каталога «поиск» и «таблица» в папке приложения. В каждом из них будет по 4 новых файла.
Давайте создадим наш компонент поиска и создадим из него событие. Сначала в search.component.html напишите следующий код:
HTML
<br><br><div> <label for="search">Enter the text</label> <br> <br> <input type="text" id="search" placeholder="type some words" (keyup)="emit(keyword.value);" #keyword></div> |
В приведенном выше коде есть простое поле ввода, которое использует функцию emit() при возникновении события keyup. Мы будем использовать это, чтобы передать ключевое слово родительскому компоненту. Давайте определим этот метод и событие в search.component.ts :
Javascript
import { Component, EventEmitter, OnInit, Output } from "@angular/core"; @Component({ selector: "app-search", templateUrl: "./search.component.html", styleUrls: ["./search.component.css"]})export class SearchComponent implements OnInit { constructor() { } ngOnInit(): void { } @Output() emitter:EventEmitter<string> = new EventEmitter<string>(); emit(keyword){ this.emitter.emit(keyword); }} |
Объект-эмиттер типа «строка» будет испускать указанный параметр в своем методе emit(). При событии keyup метод emit() выполняет метод emit() объекта-эмиттера.
Теперь давайте заполним код в table.component.ts :
Javascript
import { Component, DoCheck, Input, OnInit } from "@angular/core"; @Component({ selector: "app-table", templateUrl: "./table.component.html", styleUrls: ["./table.component.css"]})export class TableComponent implements OnInit, DoCheck { data = [ {name:"Liam", age:"20", post: "Marketing Coordinator"}, {name:"Noah", age:"25" , post:"Medical Assistant"}, {name:"Oliver", age:"22", post:"Web Designer"}, {name:"William", age:"20", post:"Dog Trainer"}, {name:"Bill", age: "22", post:"President of Sales"}, {name:"James", age: "19", post:"Project Manager"}, ]; items = []; constructor() { } @Input() keyword:string; ngOnInit(): void { this.refresh(); } ngDoCheck(){ this.refresh(); } refresh(){ this.items = []; this.data.forEach( item => { if(item.name.search(this.keyword) != -1 || item.age.search(this.keyword) != -1 || item.post.search(this.keyword) != -1) { this.items.push(item) } } ) }} |
В этом примере мы объявили объект данных, который представляет собой некоторые статические данные для нашей таблицы.
- Переменная «ключевое слово» определяется как вход для этого компонента с помощью декоратора @Input().
- Мы объявили метод refresh(), который заполняет список элементов, используя соответствие содержимого в любом из полей с переменной «ключевое слово».
- Мы вызвали этот метод в методах ngDoCheck и ngOnInit (обратите внимание, что мы должны реализовать для них интерфейс). Метод ngDoCheck называется обнаружением после изменения в приложении. Следовательно, всякий раз, когда ключевое слово изменяется в родительском, этот метод заменяет список.
- Мы покажем этот список на table.component.html, используя следующий код:
HTML
<p *ngIf="!items.length">No results found</p> <table class="table" *ngIf="items.length"> <thead > <td>Name</td> <td>Age</td> <td>Post</td> </thead> <br> <tr *ngFor="let item of items"> <td>{{item.name}}</td> <td>{{item.age}}</td> <td>{{item.post}}</td> </tr></table> |
Вышеприведенный код отображает таблицу, присутствующую в массиве «items». Теперь давайте напишем код для родительского компонента app.component.ts :
Javascript
import { Component } from "@angular/core"; @Component({ selector: "app-root", templateUrl: "./app.component.html", styleUrls: ["./app.component.css"]})export class AppComponent { title = "GeeksForGeeks"; keyword = ""; send(keyword){ this.keyword = keyword; }} |
В приведенном выше коде:
- Мы объявили переменную ключевого слова.
- Метод send() принимает ключевое слово в качестве параметра и устанавливает его в переменную класса.
- Мы будем использовать переменную класса «ключевое слово» в качестве входных данных для табличного компонента.
- Событие, сгенерированное компонентом поиска, будет обрабатываться методом send().
- См. приведенный ниже код для app.component.html :
HTML
<div> <app-search (emitter)="send($event)"></app-search></div><hr> <div> <app-table [keyword]="keyword"></app-table></div> |
В этом коде:
- Переменная «$event» представляет данные, выдаваемые компонентом поиска.
- Переменная ключевого слова табличного компонента передается как [ключевое слово].
Теперь сохраните все файлы и протестируйте код, используя:
ng serve -o
На http://localhost:4200 мы можем увидеть результат.
Выход:
