Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度5维修更换/超控_Javascript_Angular_Angular Cli_Angular5_Ng Packagr - Fatal编程技术网

Javascript 角度5维修更换/超控

Javascript 角度5维修更换/超控,javascript,angular,angular-cli,angular5,ng-packagr,Javascript,Angular,Angular Cli,Angular5,Ng Packagr,我为我的项目创建了一个包含一些组件和服务的核心库。我用ng packagr建立了图书馆。在引用库的消费项目中,我构建了包含库提供的组件的webapp。到目前为止没有什么特别的。但有时我需要一个组件(来自我的库)从库外的服务调用一个方法。这可能吗?我是否可以向库中定义的组件注入服务 干杯我以前用过这样的方法: 您的库的服务应该被定义为一个接口,而不是一个具体的实现(在OO语言中经常这样做)。如果您的实现应用程序有时只希望传入自己的服务版本,则您应该在库中创建一个默认服务,并按如下方式使用它: im

我为我的项目创建了一个包含一些组件和服务的核心库。我用ng packagr建立了图书馆。在引用库的消费项目中,我构建了包含库提供的组件的webapp。到目前为止没有什么特别的。但有时我需要一个组件(来自我的库)从库外的服务调用一个方法。这可能吗?我是否可以向库中定义的组件注入服务


干杯

我以前用过这样的方法:

您的库的服务应该被定义为一个接口,而不是一个具体的实现(在OO语言中经常这样做)。如果您的实现应用程序有时只希望传入自己的服务版本,则您应该在库中创建一个默认服务,并按如下方式使用它:

import { Component, NgModule, ModuleWithProviders, Type, InjectionToken, Inject, Injectable } from '@angular/core';

export interface ILibService {
  aFunction(): string;
}

export const LIB_SERVICE = new InjectionToken<ILibService>('LIB_SERVICE');

export interface MyLibConfig {
  myService: Type<ILibService>;
}

@Injectable()
export class DefaultLibService implements ILibService {
  aFunction() {
    return 'default';
  }
}

@Component({
  // whatever
})
export class MyLibComponent {
  constructor(@Inject(LIB_SERVICE) libService: ILibService) {
    console.log(libService.aFunction());
  }
}

@NgModule({
  declarations: [MyLibComponent],
  exports: [MyLibComponent]
})
export class LibModule {
  static forRoot(config?: MyLibConfig): ModuleWithProviders {
    return {
      ngModule: LibModule,
      providers: [
        { provide: LIB_SERVICE, useClass: config && config.myService || DefaultLibService }
      ]
    };
  }
}

这是从内存中获取的,因为我目前没有代码,因此如果出于任何原因无法使用,请告诉我。

您是否询问您的库的消费者是否可以为您的库提供不同的服务?是的,正如我们所知,Angular都是由模块构建的。要使您的组件与另一个模块(库)中声明的另一个服务/组件对话,需要将该模块导入到您的模块中(其中包含您希望与外部服务/模块对话的组件)。这正是您使用标准Angular服务的方式,如httpClient等。@Daniel W Strimpel。基本上是的。我想将核心组件和服务外包到lib中。我引用了这个库,因此引用了另一个项目中的组件。有时,我希望引用的组件使用自定义服务,而不是原始引用的服务(也是lib的一部分)。研究在您的模块上使用
forRoot
方法来提供配置信息。嘿,我试过了,效果很好。我只有一个问题:默认服务没有提供程序:)我只是将其添加到库模块的“提供程序”列表中。其余的都起作用了,因此我把这个答案作为我问题的答案。再次感谢。您不应该将其添加到提供者列表中,
forRoot
会处理此问题。我错过了服务上的
@Injectable()
装饰程序-这应该是问题所在。不幸的是,我收到了相同的问题,即使两个服务上都有@Injectable():(您能告诉我您在哪里导入模块以及确切的错误消息吗?请在我的回答中查看
MyLibComponent
——查看它希望注入
ILibService
,而不是具体的类
DefaultLibService
,这是您在
CustomFlowAComponent
中遇到的问题。)
import { NgModule, Injectable } from '@angular/core';
import { LibModule, ILibService } from 'my-lib';

@Injectable()
export class OverridingService implements ILibService {
  aFunction() {
    return 'overridden!';
  }
}

@NgModule({
  imports: [LibModule.forRoot({ myService: OverridingService })]
})
export class ImplementingModule {

}