我已经创建了一个组件库,其中包含CommonService和DatastorageService服务,这些服务在库中是单一的,这意味着我已经给出了
@Injectable({
providedIn: 'root'
})
还创建了一些常见的组件,如PriceComponents,它有计算价格的按钮。
我使用库的ng build创建了构建,然后将dist中的文件夹复制到另一个angular项目的node_modules文件夹中,以便在其他项目中使用这些公共组件和服务。
然后将库模块导入到我的项目中。我还创建了一个扩展库服务Commonservice的服务
@Injectable({
providedIn: 'root'
})
export class CCCommonService extends CommonService {
通用服务类似于
@Injectable({
providedIn: 'root'
})
export class CommonService {
formElements: any = {};
notes: any = {};
calculatePriceEvent: EventEmitter<any> = new EventEmitter();
在我的例子中,服务在库中是单例的,而不是在整个项目中。但我需要在Angular内的另一个项目中获得此库服务的相同实例。
但是,当我的应用程序首先初始化调用CommonService初始化的超级构造函数的CCCommonService构造函数时,以及当我的库中的价格组件再次使用通用服务方法通用服务工厂调用通用服务构造函数时会发生什么,这意味着通用服务构造函数被调用了两次。
但我希望像Commonservice和CCCommonService一样,应该只有一个实例,并且应该只初始化一次。
其影响是价格组件订阅了公共服务的calculatePriceEvent,但由于公共服务构造函数init的两次,事件没有到来。
export class CalculatePriceComponent implements OnInit {
constructor(public commonService: CommonService) {
this.commonService.calculatePriceEvent.subscribe(res => {
//do some action
});
}
发布于 2020-09-04 02:35:47
你想要做的事情本质上是有缺陷的。有两个单例,一个CommonService
和一个CCommonService
,它们恰好扩展了类CommonService
。注入器树不关心继承,也没有意识到这一点。如果您希望单例CCommonService
向CommonService
单例发送信号,则必须注入它并适当地连接事件。
不要扩展CommonService
,注入它并包装它。
@Injectable({
providedIn: 'root'
})
export class CCCommonService {
calculatePriceEvent = new Subject();
constructor(private commonService: CommonService) {
// mirror whatever you need
this.calculatePriceEvent.subscribe(this.commonService.calculatePriceEvent);
}
// provide needed wrapper methods and extension methods
wrappedMethod() {
this.commonService.wrappedMethod();
}
}
附注:不要在服务中使用EventEmitter
。使用rxjs
中的Subject
。
https://stackoverflow.com/questions/63729256
复制相似问题