我有类似的问题 -
我的“MenuService”依赖于“SecurityService”。
我在AppModule中提供了这两种服务,但是一旦我的MenuService被创建,我就收到错误“没有SecurityService的提供者”。
我知道SecurityService存在,因为我可以在控制台上注销。
注意* - 这两个服务定义都是从外部npm包导入的,因为我想在其他项目中使用它们。所以这可能会对根本原因产生影响。
我唯一的解决方案是创建一个MenuServiceFactory来提供MenuService并将SecurityService传递给构造函数。
实例测试案例 -
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { HeaderComponent } from './header.component';
import { provideRoutes } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { SecurityModule, SecurityService } from '@savantly/ngx-security';
import { MenuModule, MenuService } from '@savantly/ngx-menu';
const menuServiceFactory = (_securityService: SecurityService) => {
return new MenuService(_securityService);
};
describe('HeaderComponent',() => {
let component: HeaderComponent;
let fixture: ComponentFixture<HeaderComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ HeaderComponent ],
imports: [RouterTestingModule, SecurityModule.forRoot(), MenuModule],
providers: [
{
provide: MenuService,
useFactory: menuServiceFactory,
deps: [SecurityService]
},
provideRoutes([])
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(HeaderComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create',() => {
expect(component).toBeTruthy();
});
});
,如果你希望消费者也可以将此工厂转移到原来的模块有它容易 -
import { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MenuComponent } from './menu.component';
import { MenuService } from './menu.service';
import { MdMenuModule, MdToolbarModule, MdButtonModule } from '@angular/material';
import { FlexLayoutModule } from '@angular/flex-layout';
import { SecurityModule, SecurityService } from '@savantly/ngx-security';
@NgModule({
imports: [
CommonModule,
MdMenuModule, MdToolbarModule, MdButtonModule, FlexLayoutModule, SecurityModule
],
exports: [
CommonModule,
MdMenuModule, MdToolbarModule, MdButtonModule, FlexLayoutModule,
SecurityModule,
MenuComponent],
declarations: [MenuComponent],
providers: []
})
export class MenuModule {
static forRoot({securityService = SecurityService}: {securityService?: SecurityService} = {}): ModuleWithProviders {
return {
ngModule: MenuModule,
providers: [{
provide: MenuService,
useFactory: menuServiceFactory,
deps: [securityService]
}]
};
}
constructor (@Optional() @SkipSelf() parentModule: MenuModule) {
if (parentModule) {
throw new Error(
'MenuModule is already loaded. Import it in the AppModule only');
}
}
}
export function menuServiceFactory(_securityService: SecurityService): MenuService {
return new MenuService(_securityService);
}
参考 -
https://angular.io/guide/dependency-injection#factory-providers
https://github.com/savantly-net/sprout-platform
也许你可能会清除你的'node_modul es'文件夹并重新开始。 –
@GünterZöchbauer谢谢,我做到了,并在我的问题中发布了结果。 – BeniaminoBaggins
你可以发布你的find-page.component吗? – Outlooker