Как проверить изменение состояния в угловом 4/6?

Моя задача - создать веб-страницу с информацией об учетной записи, которая состоит из 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>

Мой вывод кода: Как проверить изменение состояния в угловом 4/6?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
3 778
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Поскольку вы используете реактивную форму, вы можете использовать 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 обновляется соответствующим образом.

Here's a Working Sample StackBlitz for your ref.

Вы можете поделиться фрагментом кода. Я все еще не мог понять.

Madhavan Sundararaj 27.12.2018 11:23

@MadhavanSundararaj, только что добавил рабочий образец stackblitz для вашего исх.

SiddAjmera 27.12.2018 11:24

Что делать, если Value стирается пользователем и вводится снова?

Prashant Pimpale 27.12.2018 11:33

Он работает, но если я очищу его и напишу то же значение, он все еще включен. Есть ли способ проверить это тоже? Спасибо за ваш ответ.

Madhavan Sundararaj 27.12.2018 11:34

@MadhavanSundararaj, я обновил свой ответ исправлением, которое вы хотите. Думаю, теперь это должно сработать.

SiddAjmera 27.12.2018 11:54

userValue возвращает для меня undefined. Есть ли способ исправить это?

Madhavan Sundararaj 27.12.2018 12:43

Это называется 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;
      }
    }
    );
}

WORKING EXAMPLE

Это прекрасно работает. Что здесь за контроль? В моем ts this.form = new FormGroup ({givenName: new FormControl (user.givenName), familyName: new FormControl (user.familyName), email: new FormControl (user.email),});

Madhavan Sundararaj 27.12.2018 11:47

это имя элемента управления, который вы хотите проверить

Prashant Pimpale 27.12.2018 11:48

если задано имя constrol, то changes.givenName, changes.familyName, changes.email

Prashant Pimpale 27.12.2018 11:49

попробуйте оптимизировать, так как я тороплюсь, поэтому не могу это сделать

Prashant Pimpale 27.12.2018 11:50

onChange(targetValue : string ){  
console.info(targetValue );}
<input matInput placeholder = "test" name = "test" formControlName = "testNM" (input) = "onChange($event.target.value)">

Другие вопросы по теме