首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在angular 8中共享相同的单例服务实例以及使用该库的项目

如何在angular 8中共享相同的单例服务实例以及使用该库的项目
EN

Stack Overflow用户
提问于 2020-09-04 01:57:48
回答 1查看 592关注 0票数 1

我已经创建了一个组件库,其中包含CommonService和DatastorageService服务,这些服务在库中是单一的,这意味着我已经给出了

代码语言:javascript
运行
复制
@Injectable({
  providedIn: 'root'
})

还创建了一些常见的组件,如PriceComponents,它有计算价格的按钮。

我使用库的ng build创建了构建,然后将dist中的文件夹复制到另一个angular项目的node_modules文件夹中,以便在其他项目中使用这些公共组件和服务。

然后将库模块导入到我的项目中。我还创建了一个扩展库服务Commonservice的服务

代码语言:javascript
运行
复制
@Injectable({
  providedIn: 'root'
})

export class CCCommonService extends CommonService {

通用服务类似于

代码语言:javascript
运行
复制
@Injectable({
  providedIn: 'root'
})

export class CommonService {

  formElements: any = {};
  notes: any = {};
  calculatePriceEvent: EventEmitter<any> = new EventEmitter();

在我的例子中,服务在库中是单例的,而不是在整个项目中。但我需要在Angular内的另一个项目中获得此库服务的相同实例。

但是,当我的应用程序首先初始化调用CommonService初始化的超级构造函数的CCCommonService构造函数时,以及当我的库中的价格组件再次使用通用服务方法通用服务工厂调用通用服务构造函数时会发生什么,这意味着通用服务构造函数被调用了两次。

但我希望像Commonservice和CCCommonService一样,应该只有一个实例,并且应该只初始化一次。

其影响是价格组件订阅了公共服务的calculatePriceEvent,但由于公共服务构造函数init的两次,事件没有到来。

代码语言:javascript
运行
复制
export class CalculatePriceComponent implements OnInit {

  
  constructor(public commonService: CommonService) {
    this.commonService.calculatePriceEvent.subscribe(res => {
      //do some action
    });
  }
EN

回答 1

Stack Overflow用户

发布于 2020-09-04 02:35:47

你想要做的事情本质上是有缺陷的。有两个单例,一个CommonService和一个CCommonService,它们恰好扩展了类CommonService。注入器树不关心继承,也没有意识到这一点。如果您希望单例CCommonServiceCommonService单例发送信号,则必须注入它并适当地连接事件。

不要扩展CommonService,注入它并包装它。

代码语言:javascript
运行
复制
@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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63729256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档