Из документации Angular данные могут быть разделены между компонентами с помощью:
Третий пример из документации показывает связь между родителем и потомком, поэтому здесь приведен пример двух родственных компонентов, обменивающихся данными через службу. Пример Stackblitz
Сначала настройте службу с помощью BehaviorSubject
. Это позволяет компонентам передавать данные в службу и получать данные из службы.
data.service.ts
import { Injectable } from '@angular/core';
import {of, BehaviorSubject, Observable} from 'rxjs'
@Injectable()
export class DataService {
private _data: BehaviorSubject<any> = new BehaviorSubject<any>(null)
constructor() { }
getData(): Observable<any> {
return this._data.asObservable();
}
setData(data: any) {
this._data.next(data);
}
getSomeData() {
return of([
{id: 1, name: 'Name 1'},
{id: 2, name: 'Name 2'},
{id: 3, name: 'Name 3'},
]);
}
}
Затем создайте компонент, в данном случае first.component
, в который вставлено DataService
. Этот компонент использует оба способа связи: EventEmitter
s с @Output()
s и настройку данных службы для других компонентов, на которые подписывается.
first.component.ts
import { Component, EventEmitter, OnInit, Output } from '@angular/core';
import {DataService} from '../data.service';
@Component({
selector: 'app-first',
templateUrl: './first.component.html',
styleUrls: ['./first.component.css']
})
export class FirstComponent implements OnInit {
@Output() dataLoaded: EventEmitter<any> = new EventEmitter<any>();
constructor(private dataService: DataService) { }
ngOnInit() {
this.dataService.getSomeData().subscribe(
(data: any) => {
// use this to emit data to a parent component
this.dataLoaded.emit(data);
// use this to set data in the service that other components can subscribe to
this.dataService.setData(data);
}
);
}
}
В AppComponent
установите переменную data
для хранения данных, которые отправляются из FirstComponent
.
app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
private _data: any[] = [];
get data(): any[] {
return this._data;
}
set data(data: any[]) {
this._data = data;
}
}
Затем прослушайте событие dataLoaded
в шаблоне компонента приложения и установите данные компонента приложения.
app.component.html
<app-first (dataLoaded)="data = $event"></app-first>
Чтобы получить данные для SecondComponent
, когда FirstComponent
подписывается на данные и отправляет их своему родительскому компоненту, FirstComponent
также может отправлять эти данные обратно в службу, которая помещает данные в другую Наблюдаемую, что SecondComponent
можете подписаться на.
second.component.ts
import { Component, OnInit } from '@angular/core';
import {DataService} from '../data.service';
@Component({
selector: 'app-second',
templateUrl: './second.component.html',
styleUrls: ['./second.component.css']
})
export class SecondComponent implements OnInit {
data: any[] = [];
constructor(private dataService: DataService) { }
ngOnInit() {
this.dataService.getData().subscribe(
(data: any) => this.data = data
);
}
}
SecondComponent
теперь может использовать данные, загруженные из FirstComponent
в своем шаблоне.
second.component.html
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let item of data">
<td >{{ item?.id }}</td>
<td >{{ item?.name }}</td>
</tr>
</tbody>
</table>