2017-02-21 21 views
1

У меня есть построили модель с приводом (реактивную) форму, как показано here, в угловых 2.Редактирование полей формы этикетки в угловом 2

Мой HTML выглядит следующим образом:

<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> 

В моей ts-файл:

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);   
    }); 
} 

Я добавил атрибут required в моем шаблоне, а также, как это было предложено angular docs

Цитирование:

необходимых остатки, а не для целей проверки (мы рассмотрим, что в коде), а для CSS стиля и доступности.

То, что я хочу, чтобы цикл через каждое поле формы и добавить * к соответствующей этикетке, если поле required.

Таким образом, First Name читает First Name *; и так далее.

Как бы я это сделал. Благодарю.

+0

Что значит «если это поле обязательно»? Вы все еще хотите или планируете сохранить атрибут 'required', или его нужно удалить? –

+0

@ GünterZöchbauer: Я все еще планирую сохранить атрибут. Я просто хочу, чтобы метки были обновлены. В принципе, если мне нужно 10 полей и 8, я хочу, чтобы эти метки восьми полей были отредактированы автоматически, вместо того, чтобы вручную добавлять/удалять звездочки. – Snowman

ответ

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

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

Поскольку селектор соответствует каждому элементу, который имеет атрибут required, оно применяется ко всем элементам, где должны быть обновлены на этикетке.

К сожалению nativeElement.labels поддерживается только в Chrome. Для других браузеров необходима другая стратегия, чтобы получить метку, связанную с входным элементом (см. Также Find html label associated with a given input)

+1

Спасибо, что ответили. Я попробую и дам вам знать. – Snowman

+0

Я не могу заставить это работать. Я создал новый файл, поместил в него код; включил его в мои объявления app.module. Поскольку нет специального имени, я не редактировал свой шаблон формы. Нужно ли мне? (Btw, я исправил некоторые ошибки TS, которые я получал, говоря «класс экспорта LabelRequiredDirective» и 'this.elRef.nativeElement'. Надеюсь, что все в порядке.) – Snowman

+0

Звучит нормально. Вы проверили, вызваны ли конструктор и 'ngAfterContentInit'? –