2017-02-21 3 views
1

Ich habe ein baute eine modellgetriebene (reaktiv) Form, wie here gezeigt, in Angular 2.bearbeiten Formularfeld Etiketten in Winkel 2

Meine html wie folgt aussieht:

<form [formGroup]="userForm" (ngSubmit)="onSubmit(userForm.value, userForm.valid)"> 
    <label for="firstName">First Name:</label> 
    <input type="text" formControlName="firstname" id="firstName" required> 

    <label for="lastname">Last Name:</label> 
    <input type="text" formControlName="lastname" id="lastName" required> 

    <br> 

    <label for="email">Email:</label> 
    <input type="email" formControlName="email" id="email"> 

    <br> 
</form> 

In meinem .ts-Datei:

import { FormGroup, FormControl, FormBuilder, Validators } from '@angular/forms'; 
... 

ngOnInit() { 
    this.paymentForm = this.formBuilder.group({ 
     firstname: ['', Validators.required], 
     lastname: ['', Validators.required], 
     email: ['',], 


    }) 

    this.userForm.valueChanges.subscribe(value => { 
     console.log(value);   
    }); 
} 

ich das required Attribut in meiner Vorlage als auch hinzugefügt haben, wie durch angular docs

vorgeschlagen

Zitiert:

erforderlich bleibt, nicht für die Validierung (das werden wir decken im Code), sondern für CSS-Styling und Zugänglichkeit.

Was ich will, ist, um durch jedes Formularfeld und fügen Sie ein * zu dem zugehörigen Etikett, wenn das Feld required ist.

So First Name liest First Name *; und so weiter.

Wie würde ich das machen? Vielen Dank.

+0

Was meinen Sie mit "Wenn das Feld benötigt wird"? Möchten Sie das Attribut 'required' weiterhin beibehalten oder planen, oder sollte es entfernt werden? –

+0

@ GünterZöchbauer: Ich habe immer noch vor, das Attribut zu behalten. Ich möchte nur, dass die Labels aktualisiert werden. Wenn ich 10 Felder und 8 Felder benötige, möchte ich, dass die Labels dieser 8 Felder automatisch bearbeitet werden, anstatt die Sternchen manuell hinzufügen/entfernen zu müssen. – Snowman

Antwort

1
@Directive({ 
    selector: '[required]' 
}) 
export class LabelRequiredDirective { 
    constructor(private elRef:ElementRef){} 

    ngAfterContentInit() { 
    this.elRef.nativeElement.labels.forEach(l => l.textContent += ' *'); 
    } 
} 

Da die Wähler jedes Element entspricht, auf dem required Attribut hat, wird sie auf alle Elemente angewendet, wo das Etikett aktualisiert werden soll.

Leider wird nativeElement.labels nur in Chrome unterstützt. Für andere Browser ist eine andere Strategie erforderlich, um das Label einem Eingabeelement zuzuweisen (Siehe auch Find html label associated with a given input)

+1

Danke für die Antwort. Ich werde es ausprobieren und Sie wissen lassen. – Snowman

+0

Ich kann das nicht zur Arbeit bringen. Ich habe eine neue Datei erstellt und den Code darin eingefügt. es in meinen app.module Deklarationen enthalten. Da kein benutzerdefinierter Name vorhanden ist, habe ich meine Formularvorlage nicht bearbeitet. Muss ich? (Btw, ich habe einige TS-Fehler behoben, die ich bekam, indem ich 'export class LabelRequiredDirective' und' this.elRef.nativeElement' sagte. Ich hoffe, das war in Ordnung.) – Snowman

+0

Klingt gut. Haben Sie überprüft, ob der Konstruktor und 'ngAfterContentInit' aufgerufen werden? –