用于在打开时设置默认配置的自定义NgbModal服务找不到条目组件

时间:2018-08-04 21:19:21

标签: angular angular5 ng-bootstrap

我希望我们的应用程序中的所有模态都具有一组默认选项,而不必每次打开模态时都单独应用它们。因此,我创建了一个扩展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);
  }
}

1 个答案:

答案 0 :(得分:1)

这与模块的延迟加载有关。如果入口组件位于延迟加载的模块中,则不会加载它们,并且必须将其向上移动以共享。 GitHub上有一个已发布的问题,该问题与模块中的入口组件不可用有关,但是由于未有贡献者进行大量活动,它已经开放了一年多,因此可能是一个问题,而且积压了一段时间-https://github.com/angular/angular/issues/14324