angular 动态要求的输入不影响 form.invalid 属性
angular dynamic required inputs doesn't affect form.invalid property
我有这些表单输入,是我在单击按钮后使用 *ngFor
生成的。
在这些输入中,我放置了 required
属性,但它似乎不影响 form.invalid
我有其他 required inputs
不是动态生成的,当它们没有填充值时,提交按钮是 disabled
正如我想要的那样,所以我猜问题是动态输入没有在我单击按钮之前不存在。
此外,我没有设法绑定这些输入,因为它们是动态的,我想获取它们的值并在提交表单时发送到服务。
有什么建议如何做这样的事情吗?
编辑
我已经在 component.ts
中添加了我的模型对象 this.model.players = Array(this.model.numOfTeams*this.model.numOfPlayers).fill(new Result())
在我的 html 中,我添加了 ngModel
2way 绑定。现在验证工作正常,但是当我输入其中一个字段时,所有具有相同名称(例如 firstName)的字段都会一起更改。
这是我的 component.html
:
<div class="container">
<form #newSearch="ngForm" class="form" ngNativeValidate>
<div class="form-group pl-3">
<fieldset name="generatePlayerCards">
<legend>generatePlayerCards</legend>
<p>Please choose <b>number of teams</b> and <b>number of players for each team</b>:</p>
<input class="form-control mt-3" type="number" name="numOfTeams" id="numOfTeams" min="1" max="5" placeholder="Number of teams" [(ngModel)]="model.numOfTeams" required>
<input class="form-control mt-3" type="number" name="numOfPlayers" id="numOfPlayers" min="1" max="20" placeholder="Number of players for each team" [(ngModel)]="model.numOfPlayers" required>
<button class="btn btn-primary mt-3" type="button" (click)="generatePlayerCards()">Done</button>
</fieldset>
</div>
<div class="card-group">
<div *ngFor="let j of ngArr; let i = index; trackBy:trackByIndex;" class="col-4 mt-3">
<div class="card">
<div class="card-header text-left"><h5>New Player Data</h5></div>
<div class="card-body">
<label for="firstName{{i}}"></label>
<input type="text" name="firstName{{i}}" class="form-control my-1 mr-sm-1" autocomplete="off" placeholder="First Name" required [(ngModel)]="model.players[i].firstName">
<label for="lastName{{i}}"></label>
<input type="text" name="lastName{{i}}" class="form-control my-1 mr-sm-1" autocomplete="off" placeholder="Last Name" required [(ngModel)]="model.players[i].lastName">
<label for="score{{i}}"></label>
<input type="text" name="score{{i}}" class="form-control my-1 mr-sm-1" autocomplete="off" placeholder="Score" required [(ngModel)]="model.players[i].score">
</div>
</div>
</div>
</div>
<div class="col-3 mt-4">
<button [disabled]="newSearch.form.invalid" class="btn btn-primary mr-2" type="submit" (click)="search()">Submit</button>
<button class="btn btn-secondary" type="reset" (click)="resetForm()">Clear Form</button>
</div>
</form>
</div>
在 Angular 中,为了拥有动态字段和验证,最佳做法是使用 Form Array。
乍一看似乎很复杂,但 Angular 中的 Reactive 表单是一个令人难以置信的工具,可以让您在未来毫不费力地取得很好的成果。
视频教程很多,这个是best imho.
我有这些表单输入,是我在单击按钮后使用 *ngFor
生成的。
在这些输入中,我放置了 required
属性,但它似乎不影响 form.invalid
我有其他 required inputs
不是动态生成的,当它们没有填充值时,提交按钮是 disabled
正如我想要的那样,所以我猜问题是动态输入没有在我单击按钮之前不存在。
此外,我没有设法绑定这些输入,因为它们是动态的,我想获取它们的值并在提交表单时发送到服务。 有什么建议如何做这样的事情吗?
编辑
我已经在 component.ts
中添加了我的模型对象 this.model.players = Array(this.model.numOfTeams*this.model.numOfPlayers).fill(new Result())
在我的 html 中,我添加了 ngModel
2way 绑定。现在验证工作正常,但是当我输入其中一个字段时,所有具有相同名称(例如 firstName)的字段都会一起更改。
这是我的 component.html
:
<div class="container">
<form #newSearch="ngForm" class="form" ngNativeValidate>
<div class="form-group pl-3">
<fieldset name="generatePlayerCards">
<legend>generatePlayerCards</legend>
<p>Please choose <b>number of teams</b> and <b>number of players for each team</b>:</p>
<input class="form-control mt-3" type="number" name="numOfTeams" id="numOfTeams" min="1" max="5" placeholder="Number of teams" [(ngModel)]="model.numOfTeams" required>
<input class="form-control mt-3" type="number" name="numOfPlayers" id="numOfPlayers" min="1" max="20" placeholder="Number of players for each team" [(ngModel)]="model.numOfPlayers" required>
<button class="btn btn-primary mt-3" type="button" (click)="generatePlayerCards()">Done</button>
</fieldset>
</div>
<div class="card-group">
<div *ngFor="let j of ngArr; let i = index; trackBy:trackByIndex;" class="col-4 mt-3">
<div class="card">
<div class="card-header text-left"><h5>New Player Data</h5></div>
<div class="card-body">
<label for="firstName{{i}}"></label>
<input type="text" name="firstName{{i}}" class="form-control my-1 mr-sm-1" autocomplete="off" placeholder="First Name" required [(ngModel)]="model.players[i].firstName">
<label for="lastName{{i}}"></label>
<input type="text" name="lastName{{i}}" class="form-control my-1 mr-sm-1" autocomplete="off" placeholder="Last Name" required [(ngModel)]="model.players[i].lastName">
<label for="score{{i}}"></label>
<input type="text" name="score{{i}}" class="form-control my-1 mr-sm-1" autocomplete="off" placeholder="Score" required [(ngModel)]="model.players[i].score">
</div>
</div>
</div>
</div>
<div class="col-3 mt-4">
<button [disabled]="newSearch.form.invalid" class="btn btn-primary mr-2" type="submit" (click)="search()">Submit</button>
<button class="btn btn-secondary" type="reset" (click)="resetForm()">Clear Form</button>
</div>
</form>
</div>
在 Angular 中,为了拥有动态字段和验证,最佳做法是使用 Form Array。
乍一看似乎很复杂,但 Angular 中的 Reactive 表单是一个令人难以置信的工具,可以让您在未来毫不费力地取得很好的成果。 视频教程很多,这个是best imho.