2017-08-15 2 views
1

Ich versuche Async-Validator für eine der Eingaben in einem Formular zu erstellen. Dies ist eine vereinfachte Version.Kann die Eigenschaft 'of' von undefined nicht lesen

function asyncEmailExistsValidator(control: FormControl): Observable<any> { 
    const value: string = control.value || ''; 
    let valid = true; 
    if (value == '[email protected]') { 
     valid = false; 
    } 

    return Observable.of(valid ? null : { emailExists: true }).delay(5000); 
} 

Im Moment der Ausführung i Fehler: Typeerror ERROR: nicht Eigentum 'von' undefinierten lesen kann. Wenn ich versuche zu debuggen, sehe ich, dass Observable nicht definiert ist.

Dies ist der vollständige Code dieser Komponente. Hier

import { Component, OnInit } from "@angular/core"; 
import { FormBuilder, FormGroup, FormControl, Validators } from "@angular/forms"; 
import { Router, ActivatedRoute } from "@angular/router"; 

import { Observable } from 'rxjs/Observable'; 

import { CustomDataValidator } from "./../../services/validators/input-custom-validator"; 
import { AccountService } from "./../../services/account.service"; 

function asyncEmailExistsValidator(control: FormControl): Observable<any> { 
    const value: string = control.value || ''; 
    let valid = true; 
    if (value == '[email protected]') { 
     valid = false; 
    } 

    return Observable.of(valid ? null : { emailExists: true }).delay(5000); 
} 

@Component({ 
    selector: "email-change", 
    templateUrl: "app/components/email-change/email-change.html", 
    styleUrls: ["app/components/email-change/email-change.css"] 
}) 

export class EmailChangeComponent implements OnInit { 
    emailChangeForm: FormGroup; 
    submitError: boolean = false; 
    submitErrorMessage: string = ""; 
    oldEmail = this.activatedRoute.snapshot.params["email"]; 

    emailExists: boolean = false; 
    emailConfirmClass: string = ""; 

    formValidationTest: boolean = true; 

    constructor(private fb: FormBuilder, private router: Router, private dataValidator: CustomDataValidator, 
     private activatedRoute: ActivatedRoute, private accountService: AccountService) { } 

    ngOnInit(): void { 
     this.emailChangeForm = this.fb.group({ 
      currentEmail: [{ value: this.oldEmail, disabled: true }, null ], 
      newEmailAddress: ["", 
       [ 
        Validators.required, 
        Validators.pattern('^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-][email protected][a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$'), 
        asyncEmailExistsValidator 
       ] 
      ], 
      newEmailAddressConfirm: ["", [Validators.required]] 
     }); 
    } 

    onSubmit =(): any => { 
     this.accountService.changeEmail({ 
      oldEmailAddress: this.oldEmail, newEmailAddress: this.emailChangeForm.value.newEmailAddress 
      }) 
      .subscribe((data: any) => { 
       if (data.error === true) { 
        this.submitErrorMessage = data.errorMessage; 
        this.submitError = true; 
       } 
       else { 
        this.router.navigate(["my_profile"]); 
       } 
      }); 
    } 

    onCancel =(): any => { 
     this.router.navigate(["my_profile"]); 
    } 
} 

ist mein package.json

{ 
    "version": "1.0.0", 
    "name": "tech-services", 
    "private": true, 
    "dependencies": { 
    "@angular/common": "^4.0.0", 
    "@angular/compiler": "^4.0.0", 
    "@angular/core": "^4.0.0", 
    "@angular/forms": "^4.0.0", 
    "@angular/http": "^4.0.0", 
    "@angular/platform-browser": "^4.0.0", 
    "@angular/platform-browser-dynamic": "^4.0.0", 
    "@angular/router": "^4.0.0", 
    "@angular/upgrade": "^4.0.0", 
    "bootstrap": "^3.3.7", 
    "material-design-lite": "^1.3.0", 
    "core-js": "^2.4.1", 
    "moment": "^2.14.1", 
    "reflect-metadata": "^0.1.10", 
    "rxjs": "5.1.0", 
    "systemjs": "^0.20.9", 
    "zone.js": "^0.7.6" 
    }, 
    "devDependencies": { 
    "@types/core-js": "0.9.36", 
    "gulp": "^3.9.1", 
    "gulp-clean": "^0.3.2", 
    "gulp-concat": "^2.6.1", 
    "gulp-less": "^3.3.0", 
    "gulp-sourcemaps": "^2.4.0", 
    "gulp-typescript": "^3.1.5", 
    "gulp-uglify": "^2.0.0", 
    "typescript": "^2.2.1", 
    "typings": "2.1.0" 
    } 
} 
+0

Wie Santosh darauf hingewiesen hat, müssen Sie den of-Operator importieren. Aber es ist seltsam, dass Observable nicht definiert ist. Können Sie versuchen, Ihre rxjs Bibliothek neu zu installieren – LLai

Antwort

3

Import folgende Modul

import 'rxjs/add/observable/of'; 

Oder wenn Sie verwenden viele von ihnen dann können Sie alle importieren mit

import 'rxjs/Rx'; 
+2

Es gibt fast nie eine Notwendigkeit, alle Rxjs – ChrisG

+0

@ChrisG mit Ihnen zuzustimmen. Best Practice ist nur den erforderlichen Operator importieren –

+0

Nicht treeshaking kümmern sich um das Laden nur notwendige Betreiber und andere zu verwerfen? – Skeptor

Verwandte Themen