bootstrap 模态中的组件
Component inside ng-bootstrap modal
我有一个场景,我正在使用一个显示在使用 ng-bootstrap
创建的模态弹出窗口中的表单。在模态中,我使用自定义组件来显示每个表单字段的验证消息,但看起来该组件并没有被 Angular 生命周期拾取和执行。
我使用按钮从它的父组件打开弹出窗口:
<button type="button" (click)="openFormModal()">Add something</button>
在导入了 MyModalComponent
的地方执行以下代码:
openFormModal() {
const modalRef = this.modalService.open(MyModalComponent);
}
除了自定义 validation-messages
组件外,模态框本身并没有什么特别之处。为简洁起见,代码示例省略了各种内容:
<div class="modal-body">
<form [formGroup]="myForm" class="form">
<input type="text" [ngClass]="'form-control'" formControlName="name" required maxlength="100">
<validation-messages [control]="myForm.controls.names" controlName="Name"></validation-messages>
</form>
</div>
validation-messages
组件如下:
import { Component, Input } from '@angular/core';
import { FormControl } from '@angular/forms';
import { ValidationService } from './notifications.validation.service';
@Component({
selector: 'validation-messages',
template: `<div *ngIf="errorMessage !== null" class="invalid-notification">{{errorMessage}}</div>`
})
export class ValidationMessages {
@Input() control: FormControl;
@Input() controlName: string;
constructor() { }
get errorMessage() {
for (let propertyName in this.control.errors) {
if (this.control.errors.hasOwnProperty(propertyName) && (this.control.touched && this.control.invalid)) {
return ValidationService.getValidatorErrorMessage(propertyName, this.controlName, this.control.errors[propertyName]);
}
}
return null;
}
}
validation-messages
在标准形式下完美工作,即不在模态中,但是当模态的 HTML 在屏幕上呈现时 validation-messages
呈现如下:
<validation-messages controlname="Name"></validation-messages>
而不是正常呈现的方式:
<validation-messages controlname="Business name" ng-reflect-control="[object Object]" ng-reflect-control-name="Business name">
<!--bindings={
"ng-reflect-ng-if": "false"
}-->
</validation-messages>
我是 Angular 的新手,我确信这是我所缺少的非常基本的东西。
可能还值得一提的是,我必须将 schemas: [CUSTOM_ELEMENTS_SCHEMA],
添加到我的 app.module.ts
以使模态不抱怨 validation-messages
组件出现在 HTML.
如有任何帮助,我们将不胜感激。
编辑
validation-messages
也是通知模块的一部分:
import { NgModule } from "@angular/core";
import { ValidationMessages } from "./notifications.validationmessages";
import { CommonModule } from '@angular/common';
@NgModule({
imports: [CommonModule],
declarations: [ValidationMessages],
exports: [ValidationMessages]
})
export class NotificationsModule {}
有关添加 CUSTOM_ELEMENTS_SCHEMA
的错误消息提供了一条线索,表明 Angular 不知道 ValidationMessages
组件。由于您的 ValidationMessages
组件是 NotificationsModule
的一部分,因此您需要确保该模块找到进入全局应用程序模块的方式(通常是 app.module.ts
)。
按如下方式修改 app.module.ts
应该可以解决问题:
@NgModule({
imports: [
...,
NotificationsModule
],
declarations: [
...
],
bootstrap: [
...
]
})
export class AppModule {
}
关于评论“是否添加使组件在根级别可用?”- 如果将它添加到 [= NotificationsModule
的 18=] - 像这样:
import { NgModule } from "@angular/core";
import { ValidationMessages } from "./notifications.validationmessages";
import { CommonModule } from '@angular/common';
@NgModule({
imports: [CommonModule],
declarations: [ValidationMessages],
exports: [ValidationMessages] // Available at root level/other modules
})
export class NotificationsModule {}
我有一个场景,我正在使用一个显示在使用 ng-bootstrap
创建的模态弹出窗口中的表单。在模态中,我使用自定义组件来显示每个表单字段的验证消息,但看起来该组件并没有被 Angular 生命周期拾取和执行。
我使用按钮从它的父组件打开弹出窗口:
<button type="button" (click)="openFormModal()">Add something</button>
在导入了 MyModalComponent
的地方执行以下代码:
openFormModal() {
const modalRef = this.modalService.open(MyModalComponent);
}
除了自定义 validation-messages
组件外,模态框本身并没有什么特别之处。为简洁起见,代码示例省略了各种内容:
<div class="modal-body">
<form [formGroup]="myForm" class="form">
<input type="text" [ngClass]="'form-control'" formControlName="name" required maxlength="100">
<validation-messages [control]="myForm.controls.names" controlName="Name"></validation-messages>
</form>
</div>
validation-messages
组件如下:
import { Component, Input } from '@angular/core';
import { FormControl } from '@angular/forms';
import { ValidationService } from './notifications.validation.service';
@Component({
selector: 'validation-messages',
template: `<div *ngIf="errorMessage !== null" class="invalid-notification">{{errorMessage}}</div>`
})
export class ValidationMessages {
@Input() control: FormControl;
@Input() controlName: string;
constructor() { }
get errorMessage() {
for (let propertyName in this.control.errors) {
if (this.control.errors.hasOwnProperty(propertyName) && (this.control.touched && this.control.invalid)) {
return ValidationService.getValidatorErrorMessage(propertyName, this.controlName, this.control.errors[propertyName]);
}
}
return null;
}
}
validation-messages
在标准形式下完美工作,即不在模态中,但是当模态的 HTML 在屏幕上呈现时 validation-messages
呈现如下:
<validation-messages controlname="Name"></validation-messages>
而不是正常呈现的方式:
<validation-messages controlname="Business name" ng-reflect-control="[object Object]" ng-reflect-control-name="Business name">
<!--bindings={
"ng-reflect-ng-if": "false"
}-->
</validation-messages>
我是 Angular 的新手,我确信这是我所缺少的非常基本的东西。
可能还值得一提的是,我必须将 schemas: [CUSTOM_ELEMENTS_SCHEMA],
添加到我的 app.module.ts
以使模态不抱怨 validation-messages
组件出现在 HTML.
如有任何帮助,我们将不胜感激。
编辑
validation-messages
也是通知模块的一部分:
import { NgModule } from "@angular/core";
import { ValidationMessages } from "./notifications.validationmessages";
import { CommonModule } from '@angular/common';
@NgModule({
imports: [CommonModule],
declarations: [ValidationMessages],
exports: [ValidationMessages]
})
export class NotificationsModule {}
有关添加 CUSTOM_ELEMENTS_SCHEMA
的错误消息提供了一条线索,表明 Angular 不知道 ValidationMessages
组件。由于您的 ValidationMessages
组件是 NotificationsModule
的一部分,因此您需要确保该模块找到进入全局应用程序模块的方式(通常是 app.module.ts
)。
按如下方式修改 app.module.ts
应该可以解决问题:
@NgModule({
imports: [
...,
NotificationsModule
],
declarations: [
...
],
bootstrap: [
...
]
})
export class AppModule {
}
关于评论“是否添加使组件在根级别可用?”- 如果将它添加到 [= NotificationsModule
的 18=] - 像这样:
import { NgModule } from "@angular/core";
import { ValidationMessages } from "./notifications.validationmessages";
import { CommonModule } from '@angular/common';
@NgModule({
imports: [CommonModule],
declarations: [ValidationMessages],
exports: [ValidationMessages] // Available at root level/other modules
})
export class NotificationsModule {}