【问题标题】:Angular Firebase Expected validator to return Promise or ObservableAngular Firebase 期望验证器返回 Promise 或 Observable
【发布时间】:2021-05-01 22:23:41
【问题描述】:

我在填写反应式注册表单时尝试检查是否存在相同的电子邮件地址。我想知道它正在抛出错误。请告诉我如何解决这个错误。

期望验证器返回 Promise 或 Observable

这是我的代码

email.validator.ts

import { AbstractControl, ValidationErrors } from '@angular/forms';
import { AngularFireDatabase } from '@angular/fire/database';
import { map } from 'rxjs/operators';

export class EmailValidator {

    constructor() {
    }

    static emailShouldUnique(db: AngularFireDatabase) {
        let users;
        let rawUsers: string[] = [];
        return (control: AbstractControl) => {
            return new Promise((resolve, reject) => {
                db.list('/users').snapshotChanges().pipe(
                    map(changes =>
                        changes.map(a => ({
                            key: a.payload.key, ...a.payload.val() as {}
                        }))))
                    .subscribe(data => {
                        users = data;
                        for (let index in users) {
                            rawUsers.push(users[index].email);
                        }
                        if (rawUsers.includes(control.value)) {
                            resolve({ mailSouldUnique: true })
                        }
                        else resolve(null);
                    })
            })
        }
    }
}

sign-up.component.ts


import { Component, OnInit } from '@angular/core';
import { AuthService } from '../auth.service';
import { Validators, FormBuilder } from '@angular/forms';
import { PasswordValidator } from './password.validators';
import { EmailValidator } from './email.validator';

@Component({
  selector: 'sign-up',
  templateUrl: './sign-up.component.html',
  styleUrls: ['./sign-up.component.css']
})
export class SignUpComponent {

  form;

  constructor(fb: FormBuilder, private auth: AuthService) {

    this.form = fb.group({
      fullName: ['', Validators.required],
      email: ['',
        [Validators.required, Validators.email],
        [EmailValidator.emailShouldUnique]
      ],
      phoneNumber: ['', Validators.required],
      password: ['', Validators.required],
      repeatPassword: ['', Validators.required]
    }, {
      validator: PasswordValidator.passwordShouldMatch
    })
  }

  get fullName() {
    return this.form.get('fullName');
  }
  get email() {
    return this.form.get('email');
  }
  get phoneNumber() {
    return this.form.get('phoneNumber');
  }
  get password() {
    return this.form.get('password');
  }
  get repeatPassword() {
    return this.form.get('repeatPassword');
  }
}

这是在浏览器中显示错误的 HTML 标记

<div class="form-group input-group">
                    <div class="input-group-prepend">
                        <span class="input-group-text"> <i class="fa fa-envelope"></i> </span>
                    </div>
                    <input name="email" formControlName="email" class="form-control" placeholder="Email address"
                        type="email">
                </div> <!-- form-group// -->
                <div class="alert alert-danger" *ngIf="email.touched && email.invalid">
                    <div *ngIf="email.errors.required">
                        Email Address is required.
                    </div>
                    <div *ngIf="email.errors.email">
                        Provided Email is not valid.
                    </div>
                    <div *ngIf="email.errors.shouldBeUnique">
                        Provided email is taken.
                    </div>

                </div>

【问题讨论】:

    标签: javascript angular typescript firebase-realtime-database angularfire2


    【解决方案1】:

    我认为你忘记了兑现承诺:

     return (control: AbstractControl) => {
            return new Promise((resolve, reject) => {
    

    同时尝试让所有验证器在同一个数组中:

    email: ['',
        [Validators.required, Validators.email, EmailValidator.emailShouldUnique]
      ]
    

    【讨论】:

    猜你喜欢
    • 2018-11-05
    • 2021-06-21
    • 1970-01-01
    • 2019-03-15
    • 2019-01-22
    • 2017-12-12
    • 2021-04-25
    • 2021-11-26
    相关资源
    最近更新 更多