После того, что упомянул @vincecampanale, я пришел к следующему:
В моем классе VehicleService
у меня есть следующий код для поиска транспортных средств на основе различных поисков.Класс VehicleService также включает dataChangedEvent: EventEmitter<Vehicle[]>
, который при отправке в него будет содержать самые последние результаты для Vehicle.
Вот мой VehicleService
import { Injectable, ErrorHandler, EventEmitter } from "@angular/core";
import { Observable, throwError } from 'rxjs';
import { catchError, retry } from 'rxjs/operators';
import { ConfigService } from "./ConfigService";
import { Vehicle } from "../Models/Vehicle";
import { HttpClient } from "@angular/common/http";
import { HttpResponse } from "selenium-webdriver/http";
@Injectable({
providedIn: "root"
})
export class VehicleService {
dataChangedEvent: EventEmitter<Vehicle[]> = new EventEmitter();
constructor(private http: HttpClient, private configService: ConfigService){
}
SearchVehiclesByCylinderCapacity(cylinderCapacity: any): Observable<Vehicle[]> {
var finalEndPoint = this.configService.SearchVehiclesByCylinderCapacityEndpoint + cylinderCapacity;
return this.makeRequest(finalEndPoint);
}
SearchTop10ByAirPressure(airPressure: any): Observable<Vehicle[]> {
var finalEndPoint = this.configService.SearchVehiclesByAirPressureEndpoint + airPressure;
return this.makeRequest(finalEndPoint);
}
private makeRequest(endpoint: string): Observable<Vehicle[]> {
return this.http.get<Vehicle[]>(endpoint);
}
}
Каждый дочерний компонент будет излучатьданные в dataChangedEvent
в K, как только они получили ответ в обработчике subscribe()
.
Вот дочерний компонент:
import { Component, OnInit } from '@angular/core';
import { VehicleService } from '../../Services/VehicleService';
@Component({
selector: 'app-search-engine-capacity',
templateUrl: './search-engine-capacity.component.html',
styleUrls: ['./search-engine-capacity.component.css']
})
export class SearchEngineCapacityComponent implements OnInit {
engineCapacity: any;
constructor(private vehicleService: VehicleService) {
}
ngOnInit() {
}
searchVehicle(): void {
this.vehicleService
.SearchVehiclesByEngineCapacity(this.engineCapacity)
.subscribe(response => this.vehicleService.dataChangedEvent.emit(response));
}
}
Наконец, в родительском компоненте,Я subscribe()
до dataChangedEvent
в VehicleService
, и родительский компонент будет уведомлен, когда данные для найденных автомобилей изменились.Ниже мой родительский компонент, который записывается на dataChangedEvent
в VehicleService
, из constructor
import { Component, OnInit, Input } from '@angular/core';
import { VehicleService } from '../../Services/VehicleService';
import { Vehicle } from '../../Models/Vehicle';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
vehicles: Vehicle[];
constructor(private vehicleService: VehicleService) {
this.vehicleService.dataChangedEvent.subscribe(response => this.vehicles = response)
}
ngOnInit() {
this.vehicleService
.GetAllVehicles()
.subscribe(response => this.vehicles = response,
error => console.log(error));
}
populateGrid(vehicleData: Vehicle[]){
this.vehicles = vehicleData;
}
}