具有动态返回类型的 Angular Singlton 通用服务

问题描述 投票:0回答:1

我的角度应用程序中有此事件管理服务。 我想动态设置 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 应用程序中声明。

我该如何解决这个问题? 有什么想法吗?

angular typescript angular-services angular-library
1个回答
0
投票

您的服务不需要是注射剂。它唯一有角度的部分是 on destroy 钩子,您可以在组件的方法中调用它。

我建议您手动创建服务实例,而不是注入它。这肯定会起作用,因为注射器不再受到牵连。

© www.soinside.com 2019 - 2024. All rights reserved.