2016-10-30 9 views
3

Ich entwickle ein Formular mit Angular2 FormBuilder mit benutzerdefinierten Validierung. Problem: In customValidator verwende ich this, um auf das lokale Objekt data zuzugreifen. Ich bekomme einen undefined Fehler, wenn die Validierung ausgeführt wird.Angular2 FormBuilder: Verwenden von 'this' in einem benutzerdefinierten Validator

Es ist wie der CustomValidator sieht in einem anderen Objekt ausgeführt und somit die Änderung der this Referenz

Frage: Wie kann ich einen Verweis von this zum CustomValidator passieren?

export class Ast { 
    public data:any; 
    public myForm:FormGroup; 

    constructor(private _fb:FormBuilder) { 
     this.data = {foo: "bar"}; 
    } 

    customValidator(c: FormControl) { 
     if (this.data.foo == "bar") { // This line crashes 
      // DO something 
     } 
    } 

    ngOnInit() { 
     this.myForm = this._fb.group({ 
      some_field: ['', [<any>Validators.required], this.customValidator] 
     }) 
    } 
} 

Antwort

6

einen Pfeil Funktion verwenden, um sicherzustellen, dass die Funktion dieses gebunden:

some_field: ['', [<any>Validators.required], c => this.customValidator(c)] 
+0

Ist es möglich, "this.data.foo" als Parameter an die Funktion "customValidator" zu senden? Wenn das so ist, wie? – Vanquiza

+1

Nein: Angular ruft die Validator-Funktion auf und übergibt nur ein Argument. Aber Sie tun das, indem Sie die Funktion an "this" binden und "this" aus der Funktion heraus aufrufen. Sie könnten die Daten auch an eine Funktion übergeben, die die Validatorfunktion mithilfe des Schließmechanismus erstellt und zurückgibt. Aber eine Pfeilfunktion ist einfacher. –

3

Die akzeptierte Antwort nicht auf der Eingabe Fragen in Angular 2.0 für mich arbeiten (ein AbstractControl zum Gießen a FormControl, glaube ich). Die folgenden, gelöst jedoch das Problem ganz gut:

ngOnInit() { 
    this.myForm = this._fb.group({ 
     some_field: ['', [<any>Validators.required], this.customValidator.bind(this)] 
    }); 
} 

die .bind(this) Verwendung auf dem Verweis auf den Validator der Trick für mich hat.

Verwandte Themen