我希望我们的应用程序中的所有模态都具有一组默认选项,而不必每次打开模态时都单独应用它们。因此,我创建了一个扩展NgbModal的服务,因此可以覆盖open
方法,因为在NgBootstrap v1.1.2中没有全局配置,但是找不到在功能模块中列出的入口组件。
我想知道/core
中提供的服务是否看不到功能模块中加载的输入组件?直接使用NgbModal,模态会如您所愿地打开,但是更改提供的类似乎并不能代替服务或将DI从NgbModal
切换到ModalService
会产生以下错误:
ERROR Error: No component factory found for
ConfirmReleaseDocumentsModalComponent. Did you add it to
@NgModule.entryComponents?
有人能看到为什么这可能行不通吗,还是有更好的方法在NgBootstrap v1.1.2中的模态上进行全局配置?
服务
import { Injectable } from '@angular/core';
import { NgbModal, NgbModalOptions, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
@Injectable()
export class ModalService extends NgbModal {
public open(content: any, options?: NgbModalOptions): NgbModalRef {
const defaultOptions: NgbModalOptions = {
backdrop: 'static',
keyboard: false
};
options = { ...defaultOptions, ...options }
return super.open(content, options);
}
}
应用程序模块
@NgModule({
imports: [
BrowserModule,
CoreModule,
SharedModule
],
declarations: [
AppComponent
],
bootstrap: [AppComponent]
})
export class AppModule { }
核心模块
@NgModule({
imports: [
CommonModule
],
providers: [
ModalService
]
})
export class CoreModule {
constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
throwIfAlreadyLoaded(parentModule, 'CoreModule');
}
}
功能模块
@NgModule({
imports: [
CommonModule,
SharedModule,
DocumentsRoutingModule
],
declarations: [
// ...
ConfirmReleaseDocumentsModalComponent
// ...
],
entryComponents: [
ConfirmReleaseDocumentsModalComponent
]
})
export class DocumentsModule { }
我最初尝试替换提供程序,但是由于某些原因,该操作无效:
providers: [
{ provide: NgbModal, useClass: ModalService },
]
因此,我尝试直接使用该服务:
组件打开方式
constructor(
// private modalService: NgbModal, // original that works
private modalService: ModalService, // replaced with ModalService
) { }
public releaseBatchFromQueue(): void {
fromPromise(this.modalService
.open(ConfirmReleaseDocumentsModalComponent)
.result)
.pipe(
switchMap((result: boolean) => {
return (result)
? this.documentService
.releaseFromQueue(this.selectedIds)
: Observable.empty();
})
)
.subscribe(...);
}
更新
还尝试了直接在服务中直接调用NgbModal而不进行扩展,但是会产生相同的入口组件错误:
import { Injectable } from '@angular/core';
import { NgbModal, NgbModalOptions, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
@Injectable()
export class ModalService {
constructor(
private modalService: NgbModal
) { }
public open(content: any, options?: NgbModalOptions): NgbModalRef {
const defaultOptions: NgbModalOptions = {
backdrop: 'static',
keyboard: false
};
options = { ...defaultOptions, ...options }
return this.modalService.open(content, options);
}
}
答案 0 :(得分:1)
这与模块的延迟加载有关。如果入口组件位于延迟加载的模块中,则不会加载它们,并且必须将其向上移动以共享。 GitHub上有一个已发布的问题,该问题与模块中的入口组件不可用有关,但是由于未有贡献者进行大量活动,它已经开放了一年多,因此可能是一个问题,而且积压了一段时间-https://github.com/angular/angular/issues/14324。>