私は同様の問題がありました。
私の "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