Обязательный входной эквивалент CSS-селектора в Reactive Forms - PullRequest
1 голос
/ 15 марта 2019

Есть ли эквивалентный способ input:required {CSS} выбрать с помощью CSS все реактивные поля формы в Angular, которые имеют Validators.required в своем formControl?Или для этого есть какое-то решение?

1 Ответ

1 голос
/ 15 марта 2019

ОБНОВЛЕНИЕ 2 (работает)

Angular не предоставляет решения для получения валидаторов FormControl, что означает, что нам придется вернуться к довольно хакерским решениям

То, что они в основном делают в настоящее время, это циклически проходить через FormControls, выполнять валидаторы на пустом элементе управления

const validator = abstractControl.validator({}as AbstractControl);
            if (validator && validator.required) {
                return true;
            }

и проверьте, есть ли на нем требуемый валидатор.
хотя технически это работает, он выполняет все синхронные валидаторы! Затем вы можете, например, получить ссылку на nativeElements элементов управления формы и сравнить их по formControlName.

Я создал стек, чтобы проиллюстрировать это https://stackblitz.com/edit/angular-hifypw?file=src%2Fapp%2Fapp.component.ts

требуемый FormControl будет отображаться с красным фоном. Я использовал шаблон Переменная theForm, чтобы получить элемент, который содержит FormGroup, а затем выбрать каждого потомка типа input.
Затем я зацикливаюсь на них и проверяю, есть ли у них требуемый валидатор.
Для сравнения я использую форму ControlName

 const controls =  this.getValidators(this.frmMain.controls);
      this.elements.forEach(x => {
            x.nativeElement.querySelectorAll('input').forEach(i => {

              const c = controls[i.attributes['formcontrolname'].value];

              if(i.attributes['formcontrolname'] && c && c.required && !i.classList.contains('test')) {
                i.classList.add('test');
              }

            });
    })

Я думаю, что это много работы, для чего-то довольно простого. Кроме того, мой подход в настоящее время будет работать только в том случае, если все элементы управления форм находятся в одном и том же компоненте (и, конечно, он включает только входные данные), и я понятия не имею, будет ли он работать с AOT.

Это работает, но я бы предпочел использовать пользовательскую директиву или просто простой класс CSS.

UPDATE

на данный момент единственное решение, я придумываю создать класс .required и добавить его вручную.

Может быть, вы могли бы использовать комбинацию @ViewChildren и FormControl, чтобы получить то, что вы хотите. Я буду исследовать, но это, вероятно, будет немного хакерским.

НИЖЕ РАБОТАЕТ ТОЛЬКО ДЛЯ ШАБЛОННЫХ ДВИЖУЩИХСЯ ФОРМ

Вы можете использовать input[type=text][required] и т. Д.

Хотя это в принципе сработало бы, я думаю, что это очень широкий селектор, который, вероятно, приведет к последним проблемам в вашем проекте, и вы будете писать некрасивые правила CSS, чтобы обойти это правило.
Я хотел бы создать класс css для обозначения элемента управления формой, как это делает платформа начальной загрузки.

Что-то вроде .form-control[required].
Имейте в виду, что стилизация переключателей и флажков работает совершенно иначе, чем текстовые поля и поля выбора.
Например, вы не можете установить границы для <input type="checkbox" /> и <input type="radio" />

Так что вы можете быть даже более конкретным (и все же не слишком конкретным) .form-control[type="text"][required]

или другое решение, просто создайте класс CSS .required и отделитесь от угловых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...