Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.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
Angular 模块角度导入导出中的依赖关系_Angular - Fatal编程技术网

Angular 模块角度导入导出中的依赖关系

Angular 模块角度导入导出中的依赖关系,angular,Angular,我有一个提供和导出服务的SharedModule,我希望通过引用共享模块typescript文件而不是服务typescript文件,将该服务导入另一个模块的组件中。但是构建失败了,因为在另一个组件中没有检测到导出的服务 @NgModule({ imports: [ CommonModule ], declarations: [ ... ], providers : [ LookupService ], exports : [ L

我有一个提供和导出服务的SharedModule,我希望通过引用共享模块typescript文件而不是服务typescript文件,将该服务导入另一个模块的组件中。但是构建失败了,因为在另一个组件中没有检测到导出的服务

@NgModule({
  imports: [
    CommonModule
  ],
  declarations: [
      ...
    ],
  providers : [
    LookupService
  ],
  exports : [
    LookupService
  ]
})
export class SharedModule { }
然后将其导入到另一个功能模块中

  @NgModule({
  imports: [
    CommonModule,
    SharedModule,  
  ],
  declarations: [
    LegalTermComponent
  ],
  providers : [LegalTermService]
})
export class LegalTermModule { }
在LegalTermModule中的LegalTermComponent中,我想导入

import { LookupService } from '../shared/shared.module';
这就是build抱怨的地方

   ERROR in src/app/legal-term/legal-term.component.ts(11,10): error TS2305: Module '".../src/app/shared/shared.module"' has no exported member 'LookupService'.
我不明白为什么它说没有导出的成员,而共享模块显然导出了它。谁能告诉我做这件事的正确方法吗? (如果我直接参考lookup.service.ts,导入工作正常)

谢谢!
Anand

可能是因为您没有导出LookupService类或没有将其定义为@Injectable()

服务是具有根范围的单例。如果要确保提供的服务是应用程序级别的单例服务,则需要在AppModule中导入包含服务的模块。对于FeatureModule,您希望导入SharedModule而不导入任何服务-否则,它可以创建自己的服务副本,覆盖应用程序级服务(即延迟加载的模块)-这可能不是您想要的

为此,您应该遵循从共享模块创建两个静态方法的约定:一个方法返回带服务的模块,另一个方法返回不带服务的模块

只有FeatureModule才能导入没有服务的功能。带有服务的应用程序应该由AppModule导入

仅供参考,这就是为什么存在
forRoot
(带服务)和
forChild
(不带服务)约定的原因

@NgModule({
  imports: [
    CommonModule
  ],
  declarations: [
      ... (shared components)
    ],
  providers : [

  ],
  exports : [
    ... (shared components)
  ]
})
export class SharedModule { 
     // intended to be imported by AppModule
     static forRoot(): ModuleWithProviders {
         return  {
             ngModule: SharedModule, 
             providers: [LookupService]
         }
     }

     // intended to be imported by FeatureModules
     static forChild(): ModuleWithProviders {
         return {
             ngModule: SharedModule, 
             providers: []
         }
     }
}
功能模块

@NgModule({
  imports: [
    CommonModule,
    SharedModule.forChild(),  //without services
  ],
  declarations: [
    LegalTermComponent
  ],
  providers : [LegalTermService]
})
export class LegalTermModule { }
应用程序模块

@NgModule({
  imports: [
    SharedModule.forRoot(), //with services  
  ],
  declarations: [
    ...
  ],
  providers : [
    ...
  ]
})
export class AppModule{ }

需要明确的是,提供者通常具有应用程序范围的根作用域,而不管它在哪个模块中提供。这是因为提供程序没有组件那样的模块作用域机制。唯一的例外是延迟加载的模块,它引入了自己的子根范围。

legalTermComponent在哪里
sharedModule
?你能发布LookupService类吗?该服务运行良好,是@injectable的-我正在进行一些重新组织和重新考虑,并在这个过程中试图了解更多关于模块如何工作的信息。@injectable是一个运行时问题-不是构建问题。功能组件如何导入
LookupService
从应用程序模块或功能模块中引用的共享模块的组件,不引用.ts文件?您需要导入ts文件,甚至是从共享模块。因此,尽管我有由共享模块导出的服务,该服务是从功能模块导入的,但在功能组件中,我仍然需要
导入{LookupService}来自“../shared/lookup.service”-所以我忽略了这里的要点-在从共享模块导出服务之前,我一直在这样做