我正在为跨多个应用共享的组件创建角度库。当我从库中的组件内部使用服务时,我遇到了麻烦。
该服务旨在注入应用程序的根目录(而不是库),并可在整个应用程序中使用。
在这种情况下,我们会查看ToastService
和UIToastComponent
。 UIToastComponent
是从UIToastModule
导出的。{/ p>
然后,该应用会在应用的UIToastModule
内导入AppModule
,其中也会提供ToastService
。
<ui-toast></ui-toast>
标记位于应用程序的app.component.html
文件中。
这个想法是,在应用程序内的任何组件中,开发人员都可以注入ToastService
并调用this.toastService.success('Great Success!')
,UIToastComponent
将其选中并显示吐司。
constructor
的{{1}}似乎无法接收服务,并且在运行时我出现以下错误:
UIToastComponent
Uncaught ReferenceError: ToastService is not defined
at UIToastComponent.ctorParameters (ngx-example-library.js:197)
at ReflectionCapabilities._ownParameters (core.js:2060)
at ReflectionCapabilities.parameters (core.js:2095)
at JitReflector.parameters (platform-browser-dynamic.js:61)
at CompileMetadataResolver._getDependenciesMetadata (compiler.js:15635)
at CompileMetadataResolver._getTypeMetadata (compiler.js:15527)
at CompileMetadataResolver.getNonNormalizedDirectiveMetadata
(compiler.js:15012)
at CompileMetadataResolver.loadDirectiveMetadata (compiler.js:14866)
at eval (compiler.js:34392)
at Array.forEach (<anonymous>)
中ToastService
的导入声明如下所示:
UIToastComponent
图书馆位于Angular Package Format v5之后,最初基于https://github.com/juristr/ngx-tabs-libdemo
以下是该库的源代码:ngx-example-library
修改
我根据GünterZöchbauer的建议实施了import { ToastService } from '../../services/toast.service';
但不幸的是我仍然得到了相同的结果,我可能错误地实现了它......
以下是新创建的forRoot()
在库中的样子:
UICoreModule
这是应用程序中的import { ModuleWithProviders, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { UIToastComponent } from './components/toast/toast.component';
import { ToastService } from './services/toast.service';
@NgModule({
declarations: [
UIToastComponent,
],
providers: [],
imports: [
CommonModule,
],
exports: [
UIToastComponent,
]
})
export class UICoreModule {
public static forRoot(): ModuleWithProviders {
return {ngModule: UICoreModule, providers: [ToastService]};
}
}
:
AppModule
感谢这个人的帮助,这是一个真正令人难以置信的人。打赌它真的很容易 - 当你知道如何!
编辑(2)
上面提到的解决方案 在AOT模式下工作,但不在JIT模式下工作。很高兴现在可以忍受,应用程序无论如何构建AOT。虽然应用程序增长,但可能会发展。
答案 0 :(得分:2)
您需要在定义您的包的模块中实施forRoot
,在那里提供服务并使用AppModule
MyModule.forRoot()
中导入模块
另见https://angular.io/guide/ngmodule-faq#what-is-the-forroot-method