У меня есть массив объектов json, который я связываю с HTML-формой и mat-expansion-panel
представлением.Я пытаюсь получить измененное значение name
поля ввода, но в любом случае оно возвращает начальное значение.Например, если я изменю name1
на name111
и нажму кнопку отправки, в окне предупреждения появится name1
.Если использовать this.myForm.controls["name"].value
, он возвращает последнее измененное значение, но это неверно, потому что я мог нажать кнопку сохранения другого элемента.
Как получить все значения полей ввода текущего элемента в событии отправки? (Включая измененные значения)
https://stackblitz.com/edit/angular-3xjnjv?file=src%2Fapp%2Fapp.component.ts
пример:
1) Я получаю
id1 |имя = имя1 |кнопка сохранения1
id2 |имя = имя2 |кнопка сохранения2
id3 |имя = имя3 |кнопка сохранения3
2) меняю
id1 |имя = измененное имя1 |кнопка сохранения1
id2 |имя = измененное имя2 |кнопка сохранения2
id3 |имя = измененное имя3 |кнопка сохранения3
3) нажимаю кнопку сохранения2
4) вижу item: changedname2
onSubmit() {
window.alert("item: " + this.selItem.name); // item: changedname2
}
app.component.html
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<mat-expansion-panel [expanded]="isFirst" *ngFor="let item of items; let isFirst = first; let i = index;">
<mat-expansion-panel-header>
<mat-panel-title>
<h3>{{item.id}}</h3>
</mat-panel-title>
<mat-panel-description>
This is a summary of the content
</mat-panel-description>
</mat-expansion-panel-header>
<div class="row">
<div>
<input matInput formControlName="id" value="{{item.id}}" placeholder="{{id}}" type="text">
</div>
</div>
<div class="row">
<div>
<input matInput formControlName="name" value="{{item.name}}" placeholder="{{name}}">
</div>
</div>
<button (click)="setItem(item)" mat-raised-button >{{updateItem}}</button>
</mat-expansion-panel>
</form>
app.component.ts
import { Component } from '@angular/core';
import { ChangeDetectionStrategy, OnInit, ViewChild } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import { map } from 'rxjs/operators';
import { MatSort, Sort } from '@angular/material';
import { MatPaginator, PageEvent } from '@angular/material';
import { fromMatSort, sortRows } from './datasource-utils';
import { fromMatPaginator, paginateRows } from './datasource-utils';
import { FormBuilder, FormGroup, FormArray , Validators } from '@angular/forms';
export interface PeriodicElement {
id: string;
name: string;
}
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
updateItem = 'Save';
myForm: FormGroup;
items: any;
selItem: any;
constructor(private formBuilder: FormBuilder) { }
onSubmit() {
window.alert("item: " + this.selItem.name);
window.alert(this.myForm.controls["name"].value);
// ...
}
ngOnInit() {
this.myForm = this.formBuilder.group({
id: [''],
name: ['']
});
const ELEMENT_DATA: PeriodicElement[] = [{"id":"id1",
"name":"name1"},
{"id":"id2",
"name":"name2"},
{"id":"id3",
"name":"name3"}
//,...
];
this.items = ELEMENT_DATA;
}
setItem(item) {
this.selItem = item;
}
}