我有類似的問題 -
我的「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