angular - 如何使用反应形式创建动态列和行?
问题描述
目标:用户希望根据所选城市生成动态里程表(列和行)。
我想根据选定的城市生成里程费率表。
例如:用户选择了 Pune, Navsari 并且 Delhi 是 city 。应根据用户选择生成动态里程费率表以供输入。
并且用户还可以为范围动态添加行,以便他/她可以增加范围行。像 101 - 150, 151 - 200 , 201 - 以上
解决方案
用于反应形式的动态列和行
在类型脚本中
第 1 步:初始化响应式表单
this.rForm = this._fb.group({
CityId: new FormControl(''),
CityRangeTable: this._fb.array([
])
});
第2步 :
在范围按钮上单击或加载现有的城市范围表。
(<FormArray>this.rForm.get('CityRangeTable')).clear();
this.AddRange(0);
第 3 步:
public AddRange(srNmber: number) {
let rTable = (<FormArray>this.rForm.get('CityRangeTable'));
if (rTable.length > 0 ) {
rTable.at(rTable.length - 1).get('IsLast').patchValue(false);
EndQuantity = rTable.at(rTable.length - 2).get('EndQuantity').value;
if (EndQuantity != "") rTable.at(rTable.length - 1).get('StartQuantity').patchValue((+EndQuantity + 1));
rTable.push(this.CreateRangeTable(true));
}
} else
{
//add default 2 row for entry
rTable.push(this.CreateRangeTable(false));
rTable.push(this.CreateRangeTable(true));
}
第4步
private CreateRangeTable(IsLast: boolean): FormGroup {
return this._fb.group({
Id: this._fb.control(''),
StartQuantity: this._fb.control(IsLast, [Validators.required, Validators.pattern(this.decimalSupportedRegx)]),
EndQuantity: this._fb.control('', [Validators.required, Validators.pattern(this.decimalSupportedRegx)]),
IsLast: this._fb.control(IsLast),
group: this.addGroupInRangeTable()
});
第 5 步:CityList 是多选控件,用户可以在其中选择任意数量的城市 - 动态列
public addGroupInRangeTable(): FormArray {
let fg = new FormArray([]);
this.rcForm.get('CityList').value.forEach(x => {
fg.push(this._fb.group({
CityId: new FormControl(x.Id),
CityName: new FormControl(x.Name),
RateValue: new FormControl('', [Validators.required, Validators.pattern(this.decimalSupportedRegx)])
}));
});
return fg;
}
在 Angular HTML 中
<table class="table table-bordered table-hover mt-3">
<thead>
<tr>
<th colspan="3" align="center">City Range Table caption</th>
<th *ngFor="let item of freightComponent.rcForm.get('CityList').value">
{{item.Name}}
</th>
</tr>
</thead>
<tbody>
<ng-container formArrayName="CityRangeTable">
<ng-container *ngFor="let item of rForm.get('CityRangeTable')['controls'];let o =index;">
<ng-container [formGroupName]="o">
<tr>
<td>
<input type="text" formControlName="StartQuantity" class="form-control" [readonly]="item.get('IsLast').value?null:true" />
<div *ngIf="item.get('StartQuantity').invalid && item.get('StartQuantity').touched" class="color-maroon">
<div *ngIf="item.get('StartQuantity').errors.required">
Required.
</div>
<div *ngIf="item.get('StartQuantity').errors.pattern">
Invalid.
</div>
</div>
</td>
<td>To</td>
<td *ngIf="!item.get('IsLast').value">
<input type="text" formControlName="EndQuantity" class="form-control" />
<div *ngIf="item.get('EndQuantity').invalid && item.get('EndQuantity').touched" class="color-maroon">
<div *ngIf="item.get('EndQuantity').errors.required">
Required.
</div>
<div *ngIf="item.get('EndQuantity').errors.pattern">
Invalid.
</div>
</div>
</td>
<td *ngIf="item.get('IsLast').value">
Above
<!--<input type="hidden" formControlName="EndQuantity" value="99999999" />-->
</td>
<ng-container formArrayName="group">
<ng-container *ngFor="let groupDetail of item.get('group')['controls'];let p =index;">
<ng-container [formGroupName]="p">
<td>
<input type="text" formControlName="RateValue" class="form-control" />
<div *ngIf="groupDetail.get('RateValue').invalid && groupDetail.get('RateValue').touched" class="color-maroon">
<div *ngIf="groupDetail.get('RateValue').errors.required">
Required.
</div>
<div *ngIf="groupDetail.get('RateValue').errors.pattern">
Invalid.
</div>
</div>
</td>
</ng-container>
</ng-container>
</ng-container>
<td>
<ng-container *ngIf="o==(rForm.get('CityRangeTable')['controls'].length-1)">
<a type="button"
class="fa fa-plus-circle mt4 mr5 mr10"
title="Add"
(click)="AddRanges(o)">
</a>
<a type="button"
class="fa fa-trash-alt mt7 color-maroon remove-partial-block tier"
title="Remove"
(click)="RemoveRanges(o)">
</a>
</ng-container>
</td>
</tr>
</ng-container>
</ng-container>
</ng-container>
</tbody>
</table>
推荐阅读
- google-apps-script - 用于移动到与单元格值同名的工作表的 GoogleSheet 脚本
- c# - 从 ASP.NET Core 3 调用使用 Windows 身份验证的 API
- html - 未捕获的 ReferenceError:在初始化之前无法访问“MaterialModule”
- c - 十进制到二进制函数中的分段错误
- python - for-loop 不适用于 python 中的空数据框
- python - matplotlib 在同一 x 轴上同时绘制折线图和条形图
- html - 在另一个 div 上显示 div 边框
- python - Python。sklearn.compose.ColumnTransformer 在他以前的位置不适合新列
- php - Laravel Passport 注销测试在应该被拒绝时返回 200
- angular - Angular 8:使用 formControlName 和 ControlValueAccessor 的 Mat-Select 下拉列表