Невозможно сбросить реактивную форму внутри метода .then () - PullRequest
0 голосов
/ 10 июня 2019

Я новичок в Angular, Firebase и пытаюсь сбросить форму после успешной регистрации.Итак, у меня есть метод с именем registration() в Register.component.ts файле, который будет вызываться, когда пользователь нажимает кнопку отправки.

Проблема: данные сохраняются в Firebase, но форма не сбрасывается. Я имею в виду, что поля формы не очищаются, и если я касаюсь любого поля формы, как только я отправляю, все поля формы сбрасываются.Как я могу сбросить свою форму после успешного сохранения данных в базе данных реального времени Firebase.

, когда я пытаюсь вставить this.buildForm() за пределы .then(), myForm сбрасывается, но когда я использую его внутри .then(), этоне работает, но я могу записать возвращаемое значение.Я также пытался использовать async/await та же проблема, там у меня есть блок try catch внутри блока try, если я запускаю this.buildForm() выше this.auth.register(formData) this.buildForm() работает как положено, но если я запускаю его ниже, он не работает,

Я попытался записать this внутри .then() и снаружи оба значения, кажется, одинаковы.Я прикрепил фрагменты кода component, service, html.

Register.component.ts

    import { Component, OnInit } from '@angular/core';
    import { Router } from '@angular/router';
    import { AuthService } from 'src/app/services/auth.service';
    import { MatchPassword, CustomValidator } from './register.customvalidator';
    import { FormBuilder, FormGroup, Validators } from '@angular/forms';
    import { AngularFireDatabase } from '@angular/fire/database';
    import { User } from 'src/app/user/user.model';

    @Component({
      selector: 'app-register',
      templateUrl: './register.component.html',
      styleUrls: ['./register.component.scss']
    })
    export class RegisterComponent implements OnInit {
      myForm: FormGroup;
      constructor(
        private router: Router,
        private auth: AuthService,
        private fb: FormBuilder,
        private db: AngularFireDatabase
      ) {}

      ngOnInit() {
        this.buildForm();
      }
      buildForm() {
        this.myForm = this.fb.group(
          {
            firstName: [
              '',
              [
                Validators.required,
                Validators.pattern('^[a-zA-Z][a-z A-Z]+$'),
                Validators.minLength(3)
              ]
            ],
            lastName: [
              '',
              [
                Validators.required,
                Validators.pattern('^[a-z A-Z]+$'),
                Validators.minLength(3)
              ]
            ],
            email: [
              '',
              [Validators.required, Validators.email],
              CustomValidator.uniqueEmail(this.db)
            ],
            password: [
              '',
              [
                Validators.required,
                Validators.pattern(
                  new RegExp('^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#$%^&*_])')
                ),
                Validators.minLength(6),
                Validators.maxLength(20)
              ]
            ],
            cpassword: ['', [Validators.required]],
            role: ['', [Validators.required]]
          },
          { validator: MatchPassword }
        );
      }
      get firstName() {
        return this.myForm.get('firstName');
      }
      get lastName() {
        return this.myForm.get('lastName');
      }
      get email() {
        return this.myForm.get('email');
      }
      get password() {
        return this.myForm.get('password');
      }
      get cpaswword() {
        return this.myForm.get('cpaswword');
      }
      get role() {
        return this.myForm.get('role');
      }

      register(formData: User) {
        this.auth
          .register(formData)
          .then(data => {
            if (data) {
              console.log(data);
              this.buildForm();
            }
          })
          .catch(err => console.error(err.message));
      }
      cancel() {
        this.router.navigate(['/login']);
      }
    }

Register.component.html

    <div class="xs container mt-2">
      <div class="card">
        <h1 class="display-4 text-center">Registration</h1>
        <form [formGroup]="myForm" class="p-5" (ngSubmit)="register(myForm.value)">
          <div class="row">
            <div class="form-group col-6">
              <input
                type="text"
                formControlName="firstName"
                class="form-control"
                placeholder="First Name"
              />
              <div *ngIf="firstName.touched" class="pl-2 validation-error">
                <div *ngIf="firstName.errors && (firstName?.errors)['required']">
                  Required*
                </div>
                <div *ngIf="firstName.errors && (firstName?.errors)['pattern']">
                  contains invalid Characters
                </div>
                <div *ngIf="firstName.errors && (firstName?.errors)['minlength']">
                  min length 3
                </div>
              </div>
            </div>
            <div class="form-group col-6">
              <input
                type="text"
                formControlName="lastName"
                class="form-control"
                placeholder="Last Name"
              />
              <div *ngIf="lastName.touched" class="pl-2 validation-error">
                <div *ngIf="lastName.errors && (lastName?.errors)['required']">
                  Required*
                </div>
                <div *ngIf="lastName.errors && (lastName?.errors)['pattern']">
                  contains invalid Characters
                </div>
                <div *ngIf="lastName.errors && (lastName?.errors)['minlength']">
                  min length 3
                </div>
              </div>
            </div>
          </div>
          <div class="row">
            <div class="form-group col-12">
              <input
                type="email"
                formControlName="email"
                placeholder="Email"
                class="form-control"
              />
              <div *ngIf="email.touched" class="pl-2 validation-error">
                <div *ngIf="email.errors && (email?.errors)['required']">
                  Required*
                </div>
                <div *ngIf="email?.errors && (email?.errors)['email']">
                  contains invalid Characters
                </div>
                <div *ngIf="email.valid" class="text-success">
                  {{ email.value }} is available
                </div>
                <div *ngIf="email.pending" class="text-secondary">
                  {{ email.value }} checking availability ......
                </div>
                <div
                  *ngIf="
                    email?.errors &&
                    email.dirty &&
                    !(email?.errors)['emailAvailable'] &&
                    !(email?.errors)['email']
                  "
                >
                  {{ email.value }} is already registered
                </div>
              </div>
            </div>
          </div>
          <div class="row">
            <div class="form-group col-6">
              <input
                type="password"
                formControlName="password"
                placeholder="Password"
                class="form-control"
              />

              <div *ngIf="password.touched" class="pl-2 validation-error">
                <div *ngIf="password?.errors && (password?.errors)['required']">
                  Required*
                </div>
                <div *ngIf="password?.errors && (password?.errors)['pattern']">
                  password invalid please choose other
                </div>
                <div *ngIf="password?.errors && (password?.errors)['minlength']">
                  should contain atleast 6 characters
                </div>
                <div *ngIf="password?.errors && (password?.errors)['maxlength']">
                  should contain atmost 20 characters
                </div>
              </div>
            </div>

            <div class="form-group col-6">
              <input
                type="password"
                formControlName="cpassword"
                placeholder="Confirm Password"
                class="form-control"
              />

              <div
                *ngIf="myForm?.errors && (myForm?.errors)['passwordMismatch']"
                class="validation-error text-center"
              >
                password mismatch
              </div>
            </div>
            <small id="passwordHelp" class="text-center p-2 form-text text-muted"
              >password requirements: 1 letter,1 numeric, 1 special character and
              min length 6</small
            >
          </div>
          <br />
          <div class="row">
            <div class="form-group col-12">
              <select class="form-control" formControlName="role" required>
                <option value="">Select Role</option>
                <option value="employee">Employee</option>
                <option value="admin">Admin</option>
              </select>
              <div *ngIf="role.touched" class="pl-2 validation-error">
                <div *ngIf="role.errors && (role?.errors)['required']">
                  please select one
                </div>
              </div>
            </div>
          </div>
          <div class="row">
            <div class="form-group col-6">
              <button
                type="submit"
                class="btn btn-md btn-block btn-info"
                [disabled]="myForm.invalid || myForm.untouched"
              >
                Submit
              </button>
            </div>
            <div class="form-group col-6">
              <button
                type="button"
                class="btn btn-md btn-block btn-secondary"
                (click)="cancel()"
              >
                cancel
              </button>
            </div>
          </div>
        </form>
      </div>
    </div>

auth.service.ts

    import { Injectable } from '@angular/core';
    import { AngularFireAuth } from '@angular/fire/auth';
    import { User } from 'firebase';
    import { LoaderService } from './loader.service';
    import { AngularFireDatabase } from '@angular/fire/database';
    import { take, map } from 'rxjs/operators';
    import { User as NewUser } from '../user/user.model';

    @Injectable({
      providedIn: 'root'
    })
    export class AuthService {
      constructor(
        private authDb: AngularFireAuth,
        private loader: LoaderService,
        private db: AngularFireDatabase
      ) {}

      register(user) {
        return new Promise<any>((resolve, reject) => {
          this.authDb.auth
            .createUserWithEmailAndPassword(user.email, user.password)
            .then(async res => {
              const { uid } = res.user;
              const response = this.addUserToDb(user, uid);
              resolve(response);
            })
            .catch(err => reject(err));
        });
      }

      async addUserToDb({ email, firstName, lastName, role }: NewUser, uid) {
        try {
          await this.db
            .object(`users/${uid}`)
            .set({ uid, email, firstName, lastName, role });
          return 'user Added succesfully';
        } catch (error) {
          console.log(error.message);
          return error;
        }
      }
    }

1 Ответ

0 голосов
/ 10 июня 2019

Попробуйте что-то подобное в своем коде ts:

@ViewChild(FormGroupDirective) _formGroupDirective: FormGroupDirective;
// If you're using @angular 8, use:
// @ViewChild(FormGroupDirective, {static: false}) _formGroupDirective: FormGroupDirective;

...

register(formData: User) {
  this.auth
      .register(formData)
      .then(data => {
        if (data) {
          // If you use this.myForm.reset(), the validators will be
          // fired after the reset and you'll get some validation messages
          // for the fields with Validators.required, so use:

          this._formGroupDirective.resetForm();

          // Mark the email as untouche or the e-mail valid message will be shown
          this.myForm.get('email').markAsUntouched();
        }
      })
      .catch(err => console.error(err.message));
}

И чтобы не показывать сообщение проверки ( электронное письмо доступно ) для электронного письма, если оно действительно после того, как вы отправили новое значение и очистили свою форму, вам необходимо изменить код шаблона чтобы:

<div *ngIf="myForm?.get('email')?.valid && !myForm.get('email')?.untouched" class="text-success">
  {{ myForm?.get('email')?.value }} is available
</div>                     
...