首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法读取属性“.”零角2

无法读取属性“.”零角2
EN

Stack Overflow用户
提问于 2018-03-23 10:33:31
回答 2查看 563关注 0票数 0

我正在尝试做一个自定义的异步验证器,它检查所提供的电子邮件是否已经存在于DB上。当出现错误时,它可以正常工作,但当错误得到解决(输入有效数据)时,它将显示Cannot read property 'emailIsTaken' of null

我用的是模板驱动的方法。我就是这样用的。

代码语言:javascript
复制
<input type="email" name="email" [(ngModel)]='email' #mail='ngModel' required [pattern]='emailPattern' validateEmail>

使用错误码

代码语言:javascript
复制
<div *ngIf='mail.errors["emailIsTaken"]'>Email already Registered!</div>

这是我的验证器文件

代码语言:javascript
复制
import { Validator, AbstractControl, NG_ASYNC_VALIDATORS } from '@angular/forms';
import { Directive, Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
@Directive({
    selector: '[validateEmail]',
    providers: [{
        provide: NG_ASYNC_VALIDATORS,
        useExisting: EmailValidator,
        multi: true
    }]
})

@Injectable()
export class EmailValidator implements Validator {
    constructor(private http: HttpClient){}
    validate(control: AbstractControl): Promise<any> | Observable<any> {
        return new Promise(resolve => {
            this.http.get('http://surjit.com/email.php?q=' + control.value).subscribe((success)=>{
            if(success === true){
                    resolve(null);
                }
                else{
                    resolve({'emailIsTaken': true});
                }
            });
        });
    }
}

当我使用内置的email验证器时,也会发生相同的错误。

ScreenShot

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-23 10:44:22

如果您想要执行这个异步,那么您需要实现AsyncValidator

另外,您还需要返回可观察到的结果,而不是订阅它。这里做的最简单的事情是使用可观察的而不是承诺,但是您也可以在.map()之后链接.map()。您不想在这里订阅,您希望返回可观察到的本身(或承诺),但是您确实希望这个承诺返回预期的结果,这就是为什么您应该使用map

另外,如果您还没有这样做,我建议您切换到使用pipable操作符。另见map

代码语言:javascript
复制
import { AsyncValidator } from '@angular/forms';
import { map } from 'rxjs/operators/map';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class EmailValidator implements AsyncValidator {
    constructor(private http: HttpClient){}

    validate(control: AbstractControl): Promise<any> | Observable<any> {
        return this.http.get('http://surjit.com/email.php?q=' + control.value)
                .pipe(map((success)=> success ? null : {'emailIsTaken': true}));
        }
}

上面的只是修改过的EmailValidator类。

参见我根据上面的.创建的 StackBlitz

编辑

根据错误屏幕截图,最有可能的原因是您在HTML中检查了应该根据结果验证显示哪些错误,这没有考虑到如果没有错误,验证结果是null这一事实。最简单的修复方法是使用安全导航操作员(?)和空属性路径 ?。示例:

代码语言:javascript
复制
<element *ngIf="errResult?.emailIsTaken">Email is in use</element>
票数 0
EN

Stack Overflow用户

发布于 2018-03-23 10:35:44

这是你的问题:

代码语言:javascript
复制
if(success === true){
     resolve(null);
}

如果验证成功,则返回null,而不是使用“emailIsTaken”字段的对象。

关于

代码语言:javascript
复制
if(success === true){
    resolve({'emailIsTaken': false});
}

如果这符合你的代码呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49447638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档