У меня есть сценарий, в котором я использую форму, отображаемую в модальном всплывающем окне, которое создается с помощью 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 {}