我的角度应用程序中有此事件管理服务。 我想动态设置 OnEvent() 方法的返回类型,并且我想设置在组件中注入服务的类型。
例如,这是组件 A 的构造函数,它注入了与 T 相同的服务,但具有两种不同的返回类型。
consructor(
private goodEventManagerService: EventManagementService<Array<IGood>>,
private customerEventManagerService: EventManagementService<ICustomer>
){
customerEventManagerService.emitEvent(EventManagementTypeEnum.CustomerChanged,null)
goodEventManagerService.emitEvent(EventManagementTypeEnum.CustomerChanged , [])
}
import { Injectable, OnDestroy } from '@angular/core';
import { AsyncSubject, Observable, Subject } from 'rxjs';
import { IEventPayload } from '../models/event-management';
import { EventManagementTypeEnum } from '../enums/event-management-type';
@Injectable({
providedIn: 'any',
})
export class EventManagementService<T> implements OnDestroy {
private _eventSubject$:AsyncSubject<IEventPayload<T>> = new AsyncSubject<IEventPayload<T>>();
emitEvent(eventType: EventManagementTypeEnum, data: T):void {
this._eventSubject$.next({ data: data, event: eventType });
this._eventSubject$.complete();
}
onEvent(): Observable<IEventPayload<T>> {
return this._eventSubject$.asObservable();
}
ngOnDestroy(): void {
this._eventSubject$.complete();
this._eventSubject$.unsubscribe();
}
}
这在 Angular 甚至 Typescript 中可能吗?
我不想检查每个订阅中的类型。
我测试了它,结果与第一个事件发出的返回类型相同。
ngOnInit(): void {
this.goodEventManagerService.onEvent().subscribe(res=>{
console.log("Cart Detail Component ---goodEventManagerService",res);
})
this.customerEventManagerService.onEvent().subscribe(res=>{
console.log("Cart Detail Component ---customerEventManagerService",res);
})
}
Cart Detail Component ---goodEventManagerService
{data: null, event: 'customer-changed'}
------------
Cart Detail Component ---customerEventManagerService
{data: null, event: 'customer-changed'}
如您所见,第一个数据值设置为 null,第二个数据值是一个空数组。 但两次订阅的结果都是null
EventManagementService 在 Core 模块中声明,该模块是作为 Library 的根模块。
构造函数位于名为 A 的组件中,并使用该内部库在 Angular 应用程序中声明。
我该如何解决这个问题? 有什么想法吗?
您的服务不需要是注射剂。它唯一有角度的部分是 on destroy 钩子,您可以在组件的方法中调用它。
我建议您手动创建服务实例,而不是注入它。这肯定会起作用,因为注射器不再受到牵连。