Моя задача - создать веб-страницу с информацией об учетной записи, которая состоит из 4 предварительно заполненных полей (имя, фамилия, имя пользователя и адрес электронной почты) и общей кнопки сохранения внизу. Пользователь может изменить любое поле на соответствующее поле. Я хочу, чтобы кнопка сохранения была активна только в том случае, если пользователь изменяет какие-либо поля. Есть ли способ отслеживать изменения состояния? Мой код выглядит следующим образом:
<mat-card-content>
<div class = "form-group">
<mat-form-field class = "simple-form-field-50">
<input matInput placeholder = "Given name" name = "givenName" formControlName = "givenName">
</mat-form-field>
<mat-form-field class = "simple-form-field-50">
<input matInput placeholder = "Family name" name = "familyName" formControlName = "familyName">
</mat-form-field>
<br>
<mat-form-field>
<input matInput placeholder = "Email" name = "email" formControlName = "email">
</mat-form-field>
<br>
<button
[disabled] = "waiting"
class = "simple-form-button"
color = "primary"
mat-raised-button
type = "submit"
value = "submit">
Save
</button>
</div>
</mat-card-content>
Мой вывод кода:




![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку вы используете реактивную форму, вы можете использовать valueChanges в FormGroup.
Поскольку он имеет тип Observable, вы можете указать ему subscribe, чтобы установить переменную типа boolean, которая будет использоваться в шаблоне для включения кнопки.
...
@Component({...})
export class AppComponent {
form: FormGroup;
disableButton = true;
ngOnInit() {
...
this.form.valueChanges.subscribe(changes => this.disableButton = false);
}
}
И в вашем шаблоне:
<form [formGroup] = "form">
...
<button [disabled] = "disableButton">Submit</button>
</form>
Если вы хотите отключить его, когда значения на самом деле не меняются, проверьте текущее значение формы с предыдущим значением:
import { Component } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
form: FormGroup;
disableButton = true;
userValue = {
firstName: 'John',
lastName: 'Doe',
email: '[email protected]'
}
ngOnInit() {
this.form = new FormGroup({
firstName: new FormControl(),
lastName: new FormControl(),
email: new FormControl()
});
this.form.patchValue(this.userValue);
this.form.valueChanges.subscribe(changes => this.wasFormChanged(changes));
}
private wasFormChanged(currentValue) {
const fields = ['firstName', 'lastName', 'email'];
for(let i = 0; i < fields.length; i++) {
const fieldName = fields[i];
if (this.userValue[fieldName] !== currentValue[fieldName]) {
console.info('Came inside');
this.disableButton = false;
return;
}
}
this.disableButton = true;
}
}
ЗАМЕТКА: StackBlitz обновляется соответствующим образом.
@MadhavanSundararaj, только что добавил рабочий образец stackblitz для вашего исх.
Что делать, если Value стирается пользователем и вводится снова?
Он работает, но если я очищу его и напишу то же значение, он все еще включен. Есть ли способ проверить это тоже? Спасибо за ваш ответ.
@MadhavanSundararaj, я обновил свой ответ исправлением, которое вы хотите. Думаю, теперь это должно сработать.
userValue возвращает для меня undefined. Есть ли способ исправить это?
Это называется Dirty Check.
Вы можете найти этот SO-ответ очень полезным: https://stackoverflow.com/a/50387044/1331040
Вот руководство для Template-Driven Formshttps://angular.io/guide/forms
Вот руководство для Reactive Formshttps://angular.io/guide/reactive-forms
И вот в чем разница между двумя концепциями https://blog.angular-university.io/introduction-to-angular-2-forms-template-driven-vs-model-driven/
Надеюсь на эту помощь.
Я бы сделал что-то вроде этого:
form: FormGroup;
disableButton = true;
originalObj: any;
ngOnInit() {
this.form = new FormGroup({
control: new FormControl('Value')
});
this.originalObj = this.form.controls['control'].value; // store the original value in one variable
this.form.valueChanges.subscribe(changes => {
if (this.originalObj == changes.control) // this if added for check the same value
{
this.disableButton = true;
}
else {
this.disableButton = false;
}
}
);
}
Это прекрасно работает. Что здесь за контроль? В моем ts this.form = new FormGroup ({givenName: new FormControl (user.givenName), familyName: new FormControl (user.familyName), email: new FormControl (user.email),});
это имя элемента управления, который вы хотите проверить
если задано имя constrol, то changes.givenName, changes.familyName, changes.email
попробуйте оптимизировать, так как я тороплюсь, поэтому не могу это сделать
onChange(targetValue : string ){
console.info(targetValue );}<input matInput placeholder = "test" name = "test" formControlName = "testNM" (input) = "onChange($event.target.value)">
Вы можете поделиться фрагментом кода. Я все еще не мог понять.