Угловые динамические формы и угловой материал

Я создал компонент динамической формы в Angular 5 (на основе документации и примера из https://angular.io/guide/dynamic-form).

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

Я прочитал здесь несколько статей по аналогичным вопросам, но все они, похоже, связаны с тем, что люди не импортировали правильные модули или не использовали mdInput или mat-Input вместо matInput. Это не относится к проблеме, с которой я столкнулся.

Любые мысли или советы будут оценены.

ИЗМЕНЕН КОД - ПРЕРЫВАЕТСЯ, ОШИБКА -

* поле mat-form должно содержать MatFormFieldControl. ***

Шаблон компонента управления динамической формой

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

Я импортирую все модули материалов (MatFormFieldModule и MatInputModule и т. Д. Через основной модуль. Все мои материальные входные данные и поля форм работают во всех других компонентах приложения, поэтому я не верю, что проблема в том, что мне что-то не хватает в импорте. .

<div [formGroup]="form">

    <div [ngSwitch]="control.controlType">
        <mat-form-field>
            <input matInput placeholder="{{control.label}}" *ngSwitchCase="'textbox'" [formControlName]="control.key" [id]="control.key"
                [type]="control.type">
        </mat-form-field>
        <select [id]="control.label" *ngSwitchCase="'dropdown'" [formControlName]="control.key">
            <option value="">Select {{control.label}}</option>
            <option *ngFor="let opt of control.options" [value]="opt.key">{{opt.value}}</option>
        </select>
    </div>

    <div class="errorMessage" *ngIf="!isValid">{{control.label}} is required</div>
</div>

ТЕКУЩИЙ КОД - работает отлично, но я не получаю форматирование материала angular

Селектор

<mi-dynamic-form [controls]="controls"></mi-dynamic-form>

Компонент динамической формы

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

import { DynamicFormBase } from './dynamic-form-base';

@Component({
    selector: 'mi-control',
    templateUrl: './dynamic-form-control.component.html'
})
export class DynamicFormControlComponent {

    // API
    @Input() control: DynamicFormBase<any>;
    @Input() form: FormGroup;

    get isValid() { return this.form.controls[this.control.key].valid; }
}

Шаблон компонента динамической формы

    <div [formGroup]="form">
    <div [ngSwitch]="control.controlType">
            <input  placeholder="{{control.label}}" *ngSwitchCase="'textbox'" [formControlName]="control.key" [id]="control.key"
                [type]="control.type">
        <select [id]="control.label" *ngSwitchCase="'dropdown'" [formControlName]="control.key">
            <option value="">Select {{control.label}}</option>
            <option *ngFor="let opt of control.options" [value]="opt.key">{{opt.value}}</option>
        </select>
    </div>

    <div class="errorMessage" *ngIf="!isValid">{{control.label}} is required</div>
</div>

Компонент управления динамической формой

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

import { DynamicFormBase } from './dynamic-form-base';

@Component({
    selector: 'mi-control',
    templateUrl: './dynamic-form-control.component.html'
})
export class DynamicFormControlComponent {

    // API
    @Input() control: DynamicFormBase<any>;
    @Input() form: FormGroup;

    get isValid() { return this.form.controls[this.control.key].valid; }
}

Шаблон компонента управления динамической формой

 <div [formGroup]="form">
        <!-- <label [attr.for]="control.key">{{control.label}}</label> -->

        <div [ngSwitch]="control.controlType">
            <mat-form-field>
                <input matInput placeholder="{{control.label}}" *ngSwitchCase="'textbox'" [formControlName]="key" [id]="control.key"
                    [type]="control.type">
            </mat-form-field>
            <mat-select [id]="control.label" *ngSwitchCase="'dropdown'" [formControlName]="control.key">
                <mat-option value="">Select {{control.label}}</mat-option>
                <mat-option *ngFor="let opt of control.options" [value]="opt.key">{{opt.value}}</mat-option>
            </mat-select>
        </div>

        <div class="errorMessage" *ngIf="!isValid">{{control.label}} is required</div>
    </div>

person ccocker    schedule 08.02.2018    source источник
comment
Я думаю, что ваш ‹mat-select› должен быть окружен ‹mat-form-field›   -  person A.Baudouin    schedule 08.02.2018
comment
Спасибо за быстрый ответ, но у меня это было изначально, и я вынул его, поскольку пытался исключить, была ли это ошибка с одним из них. Вставка его обратно по-прежнему дает мне ту же ошибку   -  person ccocker    schedule 08.02.2018
comment
У меня такая же проблема, вы когда-нибудь находили решение?   -  person Scott    schedule 25.11.2019


Ответы (2)


Мне удалось заставить это работать как с Angular Dynamic Forms, так и с Материал. Посмотрите рабочий пример stackblitz здесь, где показаны как динамические формы, так и использование Материалов.

person Scott    schedule 03.12.2019

Я уверен, что вы решили эту проблему. Ошибка поля mat-form должна содержать MatFormFieldControl. означает, что используемые компоненты материала не импортируются. то есть MatButtonModule необходимо импортировать при использовании директивы mat-button.

person user2722465    schedule 07.08.2018