1

In meiner Angular 2 und Materialanwendung möchte ich überprüfen, ob der Benutzername bereits vergeben ist oder nicht. Wenn es bereits vergeben ist, sollte es den Fehler anzeigen.Angular2 Material: Benutzerdefinierte Validierung für Winkelmaterial Eingabe

Ich folge unten Anleitung.
https://material.angular.io/components/input/overview#error-messages

Typoskript Datei

import {Component} from '@angular/core'; 
import {FormControl, Validators} from '@angular/forms'; 

const existingUserNames = ['rohit', 'mohit', 'ronit']; 

@Component({ 
    selector: 'input-errors-example', 
    templateUrl: 'input-errors-example.html', 
    styleUrls: ['input-errors-example.css'], 
}) 
export class InputErrorsExample { 

    emailFormControl = new FormControl('', [ 
     Validators.required 
    ] 

    // I want to call below isUserNameTaken function but dont know 
    // how to use it with Validators so that error message will be visible. 

    isUserNameTaken() : boolean { 
     this.attributeClasses = attributeClasseses; 
     this.attributeClasses.find(object => { 
      if(object.attributeClass === this.attributeClass) { 
       console.log("found " + JSON.stringify(object)); 
       return true; 
      } 
     }); 
     return false; 
    } 
} 

HTML

<form class="example-form"> 
    <md-form-field class="example-full-width"> 
    <input mdInput placeholder="Email [formControl]="emailFormControl"> 
    <md-error *ngIf="emailFormControl.hasError('required')"> 
     Email is <strong>required</strong> 
    </md-error> 

    <!-- I want to make something like that - custom validation --> 

    <md-error *ngIf="emailFormControl.hasError('username-already-taken')"> 
     Username is already taken. Please try another. 
    </md-error> 
    <!-- custom validation end -->   

    </md-form-field> 

+0

Vielleicht https://blog.thoughtram.io/angular/2016/03/14/custom-validators-in-angular-2.html einen Blick auf diesen Artikel nehmen? –

+1

Haben Sie es geschafft? Wenn ja, könnten Sie Ihre Lösung teilen. – jowey

Antwort

1

Sie müssen nur Ihre Funktion ändern, um eine Komponente als Parameter zu empfangen und zu null zurück wenn alles in Ordnung ist und ein Fehlerobjekt, wenn es nicht ist. Dann legen Sie es auf das Array des Komponentenvalidators.

// Control declaration 
emailFormControl = new FormControl('', [ 
    Validators.required, 
    isUserNameTaken 
] 

// Correct validator funcion 
isUserNameTaken(component: Component): ValidationErrors { 
    this.attributeClasses = attributeClasseses; 
    this.attributeClasses.find(object => { 
     if(object.attributeClass === this.attributeClass) { 
      console.log("found " + JSON.stringify(object)); 
      // found the username 
      return { 
       username-already-taken: { 
        username: component.value 
       } 
      }; 
     } 
    }); 
    // Everything is ok 
    return null; 
} 

Es ist in mehr Tiefe in der Verbindung erklärt, dass Will Howell (Danke, übrigens) zu den Kommentaren stellen. Es erklärt auch, wie man das Gleiche für nicht reaktive Formen tut.

Tutorial

Verwandte Themen