如何将 angular 组件传递给 Nebular 对话服务
How to pass angular component to Nebular dialog service
我正在尝试使用 Nebular
组件在 Agnular6 上创建网络对话框。有两种方法,第一种是传递 <ng-template>
引用,如:
openAddDialog = (dialogTemplate: TemplateRef<any>) => {
this.dialogServiceRef = this.dialogService.open(dialogTemplate);
}
并且运行良好。但我需要的是传递一个组件作为参数,如:
dialogService.open(MyComponent);
我的应用程序中有这个结构:
|_ pages
| |_ pages.module.ts
| |_ patient
| |_ patient.module.ts
| |_ patient.component.ts
| |_ patient.component.html
|
|_ shared
|_ shared.module.ts
|_ components
| |_ search-bar.component.ts
| |_ search-bar.component.html
|
|_ modal-form
|_ modal-form.component.ts
|_ modal-from.component.html
我已将 ModalFormComponent
添加到共享模块中的 declarations
、exports
和 entryComponents
。此外,我将其导入到 SearchBar 组件中,运行 单击 searchBar 中的按钮即可实现此功能:
openAddDialog = () => {
this.dialogServiceRef = this.dialogService.open(ModalFormComponent);
}
我在浏览器控制台中收到此错误:
ERROR Error: No component factory found for ModalFormComponent. Did you add it to @NgModule.entryComponents?
at noComponentFactoryError (core.js:19453)
at CodegenComponentFactoryResolver.resolveComponentFactory (core.js:19504)
at NbPortalOutletDirective.attachComponentPortal (portal.js:506)
at NbDialogContainerComponent.attachComponentPortal (index.js:17128)
at NbDialogService.createContent (index.js:17336)
at NbDialogService.open (index.js:17295)
at SearchBarComponent.openAddDialog (search-bar.component.ts:46)
at Object.eval [as handleEvent] (SearchBarComponent.html:11)
at handleEvent (core.js:34777)
at callWithDebugContext (core.js:36395)
有什么问题吗?我该如何解决?
使用context参数传递所有需要的参数。
例如,假设有这个 SimpleInputDialogComponent:
import { Component, Input } from '@angular/core';
import { NbDialogRef } from '@nebular/theme';
@Component({
selector: 'ngx-simple-input-dialog',
templateUrl: 'simple-input-dialog.component.html',
styleUrls: ['simple-input-dialog.component.scss'],
})
export class SimpleInputDialogComponent {
title: String;
myObject: MyObject;
constructor(protected ref: NbDialogRef<SimpleInputDialogComponent>) {
}
cancel() {
this.ref.close();
}
submit(value: String) {
this.ref.close(value);
}
}
要传递标题和 myObject,请使用上下文参数:
const sampleObject = new MyObject();
this.dialogService.open(SimpleInputDialogComponent, {
context: {
title: 'Enter template name',
myObject: sampleObject,
},
})
尽量将组件放在模块的entryComponents字段中(是主模块还是子模块,看你的情况)。
import {NgModule} from '@angular/core';
import {
//...
NbDialogModule
//...
} from '@nebular/theme';
@NgModule({
declarations: [
//...,
ModalFormComponent,
//...
],
entryComponents: [
//...
ModalFormComponent,
//...
],
imports: [
//...
// NbDialogModule.forChild() or NbDialogModule.forRoot()
//...
],
providers: [
//...
],
})
export class ExampleModule{
}
这应该可以解决您的错误。
这是 nebular
文档建议的内容:
open() {
this.dialogService.open(yourComponent, {
context: {
title: 'This is a title passed to the dialog component',
},
});
}
解决方案:参数应该在 ngOnInit
上获取,而不是在构造函数中获取
我正在尝试使用 Nebular
组件在 Agnular6 上创建网络对话框。有两种方法,第一种是传递 <ng-template>
引用,如:
openAddDialog = (dialogTemplate: TemplateRef<any>) => {
this.dialogServiceRef = this.dialogService.open(dialogTemplate);
}
并且运行良好。但我需要的是传递一个组件作为参数,如:
dialogService.open(MyComponent);
我的应用程序中有这个结构:
|_ pages
| |_ pages.module.ts
| |_ patient
| |_ patient.module.ts
| |_ patient.component.ts
| |_ patient.component.html
|
|_ shared
|_ shared.module.ts
|_ components
| |_ search-bar.component.ts
| |_ search-bar.component.html
|
|_ modal-form
|_ modal-form.component.ts
|_ modal-from.component.html
我已将 ModalFormComponent
添加到共享模块中的 declarations
、exports
和 entryComponents
。此外,我将其导入到 SearchBar 组件中,运行 单击 searchBar 中的按钮即可实现此功能:
openAddDialog = () => {
this.dialogServiceRef = this.dialogService.open(ModalFormComponent);
}
我在浏览器控制台中收到此错误:
ERROR Error: No component factory found for ModalFormComponent. Did you add it to @NgModule.entryComponents?
at noComponentFactoryError (core.js:19453)
at CodegenComponentFactoryResolver.resolveComponentFactory (core.js:19504)
at NbPortalOutletDirective.attachComponentPortal (portal.js:506)
at NbDialogContainerComponent.attachComponentPortal (index.js:17128)
at NbDialogService.createContent (index.js:17336)
at NbDialogService.open (index.js:17295)
at SearchBarComponent.openAddDialog (search-bar.component.ts:46)
at Object.eval [as handleEvent] (SearchBarComponent.html:11)
at handleEvent (core.js:34777)
at callWithDebugContext (core.js:36395)
有什么问题吗?我该如何解决?
使用context参数传递所有需要的参数。
例如,假设有这个 SimpleInputDialogComponent:
import { Component, Input } from '@angular/core';
import { NbDialogRef } from '@nebular/theme';
@Component({
selector: 'ngx-simple-input-dialog',
templateUrl: 'simple-input-dialog.component.html',
styleUrls: ['simple-input-dialog.component.scss'],
})
export class SimpleInputDialogComponent {
title: String;
myObject: MyObject;
constructor(protected ref: NbDialogRef<SimpleInputDialogComponent>) {
}
cancel() {
this.ref.close();
}
submit(value: String) {
this.ref.close(value);
}
}
要传递标题和 myObject,请使用上下文参数:
const sampleObject = new MyObject();
this.dialogService.open(SimpleInputDialogComponent, {
context: {
title: 'Enter template name',
myObject: sampleObject,
},
})
尽量将组件放在模块的entryComponents字段中(是主模块还是子模块,看你的情况)。
import {NgModule} from '@angular/core';
import {
//...
NbDialogModule
//...
} from '@nebular/theme';
@NgModule({
declarations: [
//...,
ModalFormComponent,
//...
],
entryComponents: [
//...
ModalFormComponent,
//...
],
imports: [
//...
// NbDialogModule.forChild() or NbDialogModule.forRoot()
//...
],
providers: [
//...
],
})
export class ExampleModule{
}
这应该可以解决您的错误。
这是 nebular
文档建议的内容:
open() {
this.dialogService.open(yourComponent, {
context: {
title: 'This is a title passed to the dialog component',
},
});
}
解决方案:参数应该在 ngOnInit
上获取,而不是在构造函数中获取