admin管理员组文章数量:1026989
I am trying to implement a dynamic row table where all the table cells are input fields. There is some preloaded data, but I am not able to add to the loaded data in the view. However add/ delete rows are working properly. I have tried ngModel and value but it's not working.
appponent.html:
<table>
<thead>
<button (click)="onAddRow()" *ngIf="addForm.get('rows')">add row</button>
</thead>
<tbody>
<tr *ngFor="let row of addForm.get('rows')?.controls;let index = index;">
<!-- NOT WORKING with ngModel
<td>name : <input [ngModel]="row.get('name')" [formControl]="row.get('name')"></td> -->
<!-- NOT WORKING with value attribute
<td>name : <input value="row.get('name')" [formControl]="row.get('name')">\</td> -->
<td>
name : <input [formControl]="row.get('name')">
</td>
<td>
description : <input [formControl]="row.get('description')">
</td>
<td>
qty : <input [formControl]="row.get('qty')">
</td>
<td>
<button (click)="onRemoveRow(index)">Remove</button>
</td>
</tr>
</tbody>
</table>
appponent.ts:
import { Component } from '@angular/core';
import { FormGroup, FormBuilder, Validators, FormControl, FormArray, NgForm } from '@angular/forms'
@Component({
selector: 'my-app',
templateUrl: './appponent.html',
styleUrls: ['./appponent.css']
})
export class AppComponent {
addForm: FormGroup;
rows: FormArray;
itemForm: FormGroup;
constructor(private fb: FormBuilder) {
this.addForm = this.fb.group({
items: [null, Validators.required],
items_value: ['no', Validators.required]
});
this.rows = this.fb.array([{
"name": "Test Item",
"description": "Dedsc",
"qty": "q23"
}]);
}
ngOnInit() {
this.addForm.get("items").valueChanges.subscribe(val => {
if (val === true) {
this.addForm.get("items_value").setValue("yes");
this.addForm.addControl('rows', this.rows);
}
if (val === false) {
this.addForm.get("items_value").setValue("no");
this.addForm.removeControl('rows');
}
});
}
onAddRow() {
this.rows.push(this.createItemFormGroup());
}
onRemoveRow(rowIndex:number){
this.rows.removeAt(rowIndex);
}
createItemFormGroup(): FormGroup {
return this.fb.group({
name: null,
description: null,
qty: null
});
}
}
My output:
Expected output:
Also putting one Stackblitz Example for better reference.
I am trying to implement a dynamic row table where all the table cells are input fields. There is some preloaded data, but I am not able to add to the loaded data in the view. However add/ delete rows are working properly. I have tried ngModel and value but it's not working.
app.ponent.html:
<table>
<thead>
<button (click)="onAddRow()" *ngIf="addForm.get('rows')">add row</button>
</thead>
<tbody>
<tr *ngFor="let row of addForm.get('rows')?.controls;let index = index;">
<!-- NOT WORKING with ngModel
<td>name : <input [ngModel]="row.get('name')" [formControl]="row.get('name')"></td> -->
<!-- NOT WORKING with value attribute
<td>name : <input value="row.get('name')" [formControl]="row.get('name')">\</td> -->
<td>
name : <input [formControl]="row.get('name')">
</td>
<td>
description : <input [formControl]="row.get('description')">
</td>
<td>
qty : <input [formControl]="row.get('qty')">
</td>
<td>
<button (click)="onRemoveRow(index)">Remove</button>
</td>
</tr>
</tbody>
</table>
app.ponent.ts:
import { Component } from '@angular/core';
import { FormGroup, FormBuilder, Validators, FormControl, FormArray, NgForm } from '@angular/forms'
@Component({
selector: 'my-app',
templateUrl: './app.ponent.html',
styleUrls: ['./app.ponent.css']
})
export class AppComponent {
addForm: FormGroup;
rows: FormArray;
itemForm: FormGroup;
constructor(private fb: FormBuilder) {
this.addForm = this.fb.group({
items: [null, Validators.required],
items_value: ['no', Validators.required]
});
this.rows = this.fb.array([{
"name": "Test Item",
"description": "Dedsc",
"qty": "q23"
}]);
}
ngOnInit() {
this.addForm.get("items").valueChanges.subscribe(val => {
if (val === true) {
this.addForm.get("items_value").setValue("yes");
this.addForm.addControl('rows', this.rows);
}
if (val === false) {
this.addForm.get("items_value").setValue("no");
this.addForm.removeControl('rows');
}
});
}
onAddRow() {
this.rows.push(this.createItemFormGroup());
}
onRemoveRow(rowIndex:number){
this.rows.removeAt(rowIndex);
}
createItemFormGroup(): FormGroup {
return this.fb.group({
name: null,
description: null,
qty: null
});
}
}
My output:
Expected output:
Also putting one Stackblitz Example for better reference.
Share Improve this question asked Jul 8, 2020 at 19:07 Pritam MullickPritam Mullick 2253 silver badges14 bronze badges2 Answers
Reset to default 2You don't need [ngModel]
because you already working with reactive forms. These inputs are empty because you create each item form group with null
values. If you have preloaded data you need to pass it as initial value for each control in createItemFormGroup
method or update the value by methods setValue/patchValue
of form array or appropriate form group.
i am not sure if that will be exactly what you want, but check this one out: https://stackblitz./edit/dynamically-add-rows-k2lbkw
- i replaced the formControl attribute with formControlName. Note the value property
<td>
name : <input formControlName="name"
[ngModel]="row.get('name').value" >
</td>
- added the name, description, qty to the form builder object.
constructor(private fb: FormBuilder) {
this.addForm = this.fb.group({
items: [null, Validators.required],
items_value: ['no', Validators.required],
name: [null, Validators.required],
description: [null, Validators.required],
qty: [null, Validators.required]
});
this.rows = this.fb.array([]);
}
- and added some dummy values on the createItemFormGroup method
I am trying to implement a dynamic row table where all the table cells are input fields. There is some preloaded data, but I am not able to add to the loaded data in the view. However add/ delete rows are working properly. I have tried ngModel and value but it's not working.
appponent.html:
<table>
<thead>
<button (click)="onAddRow()" *ngIf="addForm.get('rows')">add row</button>
</thead>
<tbody>
<tr *ngFor="let row of addForm.get('rows')?.controls;let index = index;">
<!-- NOT WORKING with ngModel
<td>name : <input [ngModel]="row.get('name')" [formControl]="row.get('name')"></td> -->
<!-- NOT WORKING with value attribute
<td>name : <input value="row.get('name')" [formControl]="row.get('name')">\</td> -->
<td>
name : <input [formControl]="row.get('name')">
</td>
<td>
description : <input [formControl]="row.get('description')">
</td>
<td>
qty : <input [formControl]="row.get('qty')">
</td>
<td>
<button (click)="onRemoveRow(index)">Remove</button>
</td>
</tr>
</tbody>
</table>
appponent.ts:
import { Component } from '@angular/core';
import { FormGroup, FormBuilder, Validators, FormControl, FormArray, NgForm } from '@angular/forms'
@Component({
selector: 'my-app',
templateUrl: './appponent.html',
styleUrls: ['./appponent.css']
})
export class AppComponent {
addForm: FormGroup;
rows: FormArray;
itemForm: FormGroup;
constructor(private fb: FormBuilder) {
this.addForm = this.fb.group({
items: [null, Validators.required],
items_value: ['no', Validators.required]
});
this.rows = this.fb.array([{
"name": "Test Item",
"description": "Dedsc",
"qty": "q23"
}]);
}
ngOnInit() {
this.addForm.get("items").valueChanges.subscribe(val => {
if (val === true) {
this.addForm.get("items_value").setValue("yes");
this.addForm.addControl('rows', this.rows);
}
if (val === false) {
this.addForm.get("items_value").setValue("no");
this.addForm.removeControl('rows');
}
});
}
onAddRow() {
this.rows.push(this.createItemFormGroup());
}
onRemoveRow(rowIndex:number){
this.rows.removeAt(rowIndex);
}
createItemFormGroup(): FormGroup {
return this.fb.group({
name: null,
description: null,
qty: null
});
}
}
My output:
Expected output:
Also putting one Stackblitz Example for better reference.
I am trying to implement a dynamic row table where all the table cells are input fields. There is some preloaded data, but I am not able to add to the loaded data in the view. However add/ delete rows are working properly. I have tried ngModel and value but it's not working.
app.ponent.html:
<table>
<thead>
<button (click)="onAddRow()" *ngIf="addForm.get('rows')">add row</button>
</thead>
<tbody>
<tr *ngFor="let row of addForm.get('rows')?.controls;let index = index;">
<!-- NOT WORKING with ngModel
<td>name : <input [ngModel]="row.get('name')" [formControl]="row.get('name')"></td> -->
<!-- NOT WORKING with value attribute
<td>name : <input value="row.get('name')" [formControl]="row.get('name')">\</td> -->
<td>
name : <input [formControl]="row.get('name')">
</td>
<td>
description : <input [formControl]="row.get('description')">
</td>
<td>
qty : <input [formControl]="row.get('qty')">
</td>
<td>
<button (click)="onRemoveRow(index)">Remove</button>
</td>
</tr>
</tbody>
</table>
app.ponent.ts:
import { Component } from '@angular/core';
import { FormGroup, FormBuilder, Validators, FormControl, FormArray, NgForm } from '@angular/forms'
@Component({
selector: 'my-app',
templateUrl: './app.ponent.html',
styleUrls: ['./app.ponent.css']
})
export class AppComponent {
addForm: FormGroup;
rows: FormArray;
itemForm: FormGroup;
constructor(private fb: FormBuilder) {
this.addForm = this.fb.group({
items: [null, Validators.required],
items_value: ['no', Validators.required]
});
this.rows = this.fb.array([{
"name": "Test Item",
"description": "Dedsc",
"qty": "q23"
}]);
}
ngOnInit() {
this.addForm.get("items").valueChanges.subscribe(val => {
if (val === true) {
this.addForm.get("items_value").setValue("yes");
this.addForm.addControl('rows', this.rows);
}
if (val === false) {
this.addForm.get("items_value").setValue("no");
this.addForm.removeControl('rows');
}
});
}
onAddRow() {
this.rows.push(this.createItemFormGroup());
}
onRemoveRow(rowIndex:number){
this.rows.removeAt(rowIndex);
}
createItemFormGroup(): FormGroup {
return this.fb.group({
name: null,
description: null,
qty: null
});
}
}
My output:
Expected output:
Also putting one Stackblitz Example for better reference.
Share Improve this question asked Jul 8, 2020 at 19:07 Pritam MullickPritam Mullick 2253 silver badges14 bronze badges2 Answers
Reset to default 2You don't need [ngModel]
because you already working with reactive forms. These inputs are empty because you create each item form group with null
values. If you have preloaded data you need to pass it as initial value for each control in createItemFormGroup
method or update the value by methods setValue/patchValue
of form array or appropriate form group.
i am not sure if that will be exactly what you want, but check this one out: https://stackblitz./edit/dynamically-add-rows-k2lbkw
- i replaced the formControl attribute with formControlName. Note the value property
<td>
name : <input formControlName="name"
[ngModel]="row.get('name').value" >
</td>
- added the name, description, qty to the form builder object.
constructor(private fb: FormBuilder) {
this.addForm = this.fb.group({
items: [null, Validators.required],
items_value: ['no', Validators.required],
name: [null, Validators.required],
description: [null, Validators.required],
qty: [null, Validators.required]
});
this.rows = this.fb.array([]);
}
- and added some dummy values on the createItemFormGroup method
本文标签: javascriptAdd Dynamic value to input field inside a table in Angular 4Stack Overflow
版权声明:本文标题:javascript - Add Dynamic value to input field inside a table in Angular 4 - Stack Overflow 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/questions/1745661198a2161901.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论