在 Angular 6 中使用 ngFor 循环动态创建输入元素数组并添加基于模板引用变量的动态验证
use ngFor loop in Angular 6 to dynamically create array of input elements and add dynamical validation based on template reference variables
我想在 Angular 6 中动态创建 3 个输入标签而不是 copy/paste html 代码,因为输入元素具有相似的 html 和功能。
为此,我在组件内部创建了一个数组 "reusableItems" 并对其进行了初始化:
let numberOfInputElements = 3;
for (let i = 0; i < numberOfInputElements; i++) {
this.reusableItems.push({
answer: 'Answer ' + (i +1),
passwordRecoveryAnswer: this.user['passwordRecoveryAnswer' + (i + 1)]
});
}
然后我将代码放入 html :
<div *ngFor="let item of dropDownDataManagerService.reusableItems" >
<li class="col-xs-12 pl-lg pr0 pv-sm bd1-bottom">
<div class="col-xs-4 ph0 pt"> {{item.answerTitle}}</div>
<div class="col-xs-8">
<input type="text" name={{item.answer}} ref-{{item.answer}}="ngModel" class="col-sm-12 k-textbox ph0"
[(ngModel)]=item.passwordRecoveryAnswer
[pattern]="[a-z]"
required autocomplete="off"/>
</div>
</li>
</div>
它似乎工作正常,但当这些字段为空且与模式不匹配时,我需要添加错误消息。像 :
<div *ngIf="__{{item.answer}}__.errors?.required ">
{{'Please provide an answer' | translate}}
</div>
<div *ngIf="__{{item.answer}}__.errors?.pattern">
{{'Pattern is not match'}}
</div>
我不知道应该在 ngIf 条件中放入什么。
如果我的模板引用变量来自数组,我该怎么办?
有人有想法吗?
谢谢
Angular 为每个嵌入式模板创建唯一的模板引用变量,以便您可以在 ngFor 循环中使用相同的模板引用变量名称:
<div *ngFor="let item of reusableItems">
<li class="col-xs-12 pl-lg pr0 pv-sm bd1-bottom">
<div class="col-xs-4 ph0 pt"> {{item.answerTitle}}</div>
<div class="col-xs-8">
<input type="text" name={{item.answer}} ref-answer="ngModel" class="col-sm-12 k-textbox ph0" [(ngModel)]="item.passwordRecoveryAnswer"
[pattern]="'[a-z]'" required autocomplete="off" />
<div *ngIf="answer.errors?.required">
{{'Please provide an answer'}}
</div>
<div *ngIf="answer.errors?.pattern">
{{'Pattern is not match'}}
</div>
</div>
</li>
</div>
在上面的代码中,我为数组中的每个输入使用相同的名称
ref-answer="ngModel" // or you can also use #answer="ngModel
我想在 Angular 6 中动态创建 3 个输入标签而不是 copy/paste html 代码,因为输入元素具有相似的 html 和功能。
为此,我在组件内部创建了一个数组 "reusableItems" 并对其进行了初始化:
let numberOfInputElements = 3;
for (let i = 0; i < numberOfInputElements; i++) {
this.reusableItems.push({
answer: 'Answer ' + (i +1),
passwordRecoveryAnswer: this.user['passwordRecoveryAnswer' + (i + 1)]
});
}
然后我将代码放入 html :
<div *ngFor="let item of dropDownDataManagerService.reusableItems" >
<li class="col-xs-12 pl-lg pr0 pv-sm bd1-bottom">
<div class="col-xs-4 ph0 pt"> {{item.answerTitle}}</div>
<div class="col-xs-8">
<input type="text" name={{item.answer}} ref-{{item.answer}}="ngModel" class="col-sm-12 k-textbox ph0"
[(ngModel)]=item.passwordRecoveryAnswer
[pattern]="[a-z]"
required autocomplete="off"/>
</div>
</li>
</div>
它似乎工作正常,但当这些字段为空且与模式不匹配时,我需要添加错误消息。像 :
<div *ngIf="__{{item.answer}}__.errors?.required ">
{{'Please provide an answer' | translate}}
</div>
<div *ngIf="__{{item.answer}}__.errors?.pattern">
{{'Pattern is not match'}}
</div>
我不知道应该在 ngIf 条件中放入什么。 如果我的模板引用变量来自数组,我该怎么办? 有人有想法吗?
谢谢
Angular 为每个嵌入式模板创建唯一的模板引用变量,以便您可以在 ngFor 循环中使用相同的模板引用变量名称:
<div *ngFor="let item of reusableItems">
<li class="col-xs-12 pl-lg pr0 pv-sm bd1-bottom">
<div class="col-xs-4 ph0 pt"> {{item.answerTitle}}</div>
<div class="col-xs-8">
<input type="text" name={{item.answer}} ref-answer="ngModel" class="col-sm-12 k-textbox ph0" [(ngModel)]="item.passwordRecoveryAnswer"
[pattern]="'[a-z]'" required autocomplete="off" />
<div *ngIf="answer.errors?.required">
{{'Please provide an answer'}}
</div>
<div *ngIf="answer.errors?.pattern">
{{'Pattern is not match'}}
</div>
</div>
</li>
</div>
在上面的代码中,我为数组中的每个输入使用相同的名称
ref-answer="ngModel" // or you can also use #answer="ngModel