Как мне создать компонент, который содержит поле формы мата и ввод?

Я работаю над проектом, в котором используется много вложенных реактивных форм, и я хочу создать элемент управления, который оборачивает как поле Mat-Form-Field, так и ввод в один компонент, но когда я пробую это в своей форме, я продолжаю получать ошибки .

Я думаю, проблема в том, что элемент управления находится в массиве, поскольку он работает сам по себе.

В настоящее время с приведенным ниже кодом я получаю следующее сообщение об ошибке BasicInputComponent.html:2 ERROR Error: Не удается найти элемент управления с именем: 'firstName'

Я также пытался использовать ControlValueAccessor, но я не уверен, что это правильный способ ведения дел, и когда я попробовал, я не смог заставить мат-из-поля распознать, что он недействителен.

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

HTML-код дочернего компонента:

<mat-form-field floatLabel = "never" class = "ng-untouched ng-pristine ng-invalid">
    <input matInput #input [placeholder] = "placeholder" [type] = "type" [attr.maxlength] = "maxlength" type = "text" [formControlName] = "controlName"/>
    <mat-hint *ngIf = "maxlength" align = "end">{{input.value?.length || 0}}/{{maxlength}}</mat-hint>
</mat-form-field>

Дочерний компонент ts

@Component({
    selector: 'app-basic-input',
    templateUrl: './basic-input.component.html',
    styleUrls: ['./basic-input.component.css'],
    viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }]
})
export class BasicInputComponent { 

    @Input() placeholder: string;
    @Input() controlName: string;
    @Input() maxlength: number | null;

    constructor() {}
}

Родительский html:

<form [formGroup] = "vehicle">
    <div formArrayName = "occupants" *ngFor = "let occupant of vehicle.get('occupants')['controls']; let i = index;">
        <div [formGroupName] = "i">
              <app-basic-input placeholder = "First Name" controlName = "firstName" maxlength = "25"></app-basic-input>
        </div>
    </div>
</form>

Родитель ТС:

    vehicle= this.fb.group({
        occupants: this.fb.array([
            this.fb.group({
                firstName: ['', Validators.required],
                lastName: ['', Validators.required]
            })
        ])
    })  
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
77
1

Ответы 1

Попробуйте разделить эту строку в родитель.html:

...
<div formArrayName = "occupants" *ngFor = "let occupant of vehicle.get('occupants')['controls']; let i = index;">
...
</div>
...

в

...
<div formArrayName = "occupants">
  <div *ngFor = "let occupant of vehicle.get('occupants')['controls']; let i = index;">
  ...
  </div>
</div>
...

Спасибо, но это, кажется, не имеет никакого значения, я все еще получаю ту же ошибку.

Phil Pratt 01.02.2019 16:02

Другие вопросы по теме