Ошибка синтаксического анализа шаблона ngFor, FormArray

Я создаю динамические объекты, используя ReactiveFormsModule. Мой основной модуль — приложение. Затем у меня есть подмодуль config. этот компонент имеет ObjectConfigComponent и FieldConfigComponent.

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

Вот мой код.

export class CompositeObject {
    public fields: Field[];
}

export class Field {
    public name: string;
    public datatype: DataType;
}

export enum DataType {
    string = 1,
    number,
    date
}

Компонент ObjectConfig:

import { Component, OnInit } from '@angular/core';
import { CompositeObject } from './../../models/compositeobject';
import { Validators, FormGroup, FormArray, FormBuilder } from '@angular/forms';

@Component({
    selector: 'objectconfig',
    templateUrl: 'objectconfig.component.html'
})
export class ObjectConfigComponent implements OnInit {
    public myForm: FormGroup;
    constructor(private _formbuilder: FormBuilder) { }

    public ngOnInit() {
        this.myForm = this._formbuilder.group({
            fields: this._formbuilder.array([
                this.initField(),
            ])
        });
     }

    public save(model: CompositeObject ) {
         console.log(model);
    }

    private initField() {
        // initialize our address
        return this._formbuilder.group({
            name: ['', Validators.required],
            datatype: ['string', Validators.required]
        });
    }

    private addField() {
    // add address to the list
        const control = <FormArray>this.myForm.controls['fields'];
        control.push(this.initField());
    }

    private removeField(i: number) {
    // remove address from the list
        const control = <FormArray>this.myForm.controls['fields'];
        control.removeAt(i);
    }
}

HTML:

<div class="row">
    <div class="well bs-component">
        <form [formGroup]="myForm" novalidate (ngSubmit)="save(myForm)">
            <!--fields-->
            <div formArrayName="fields">
                <div *ngFor="let field of myForm.controls.fields.controls; let i=index">
                    <div [formGroupName]="i">
                        <fieldform [group]="myForm.controls.fields.controls[i]"></fieldform>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <div class="col-lg-10 col-lg-offset-2">
                    <button class="btn btn-link" (click)="addField()">Add another attribute</button>
                </div>
            </div>
            <div class="form-group">
                <div class="col-lg-10 col-lg-offset-2">
                    <button type="reset" class="btn btn-default">Cancel</button>
                    <button type="submit" class="btn btn-primary">Submit</button>
                </div>
            </div>
        </form>
    </div>
</div>

Компонент ФилдФорм

import { Component, OnInit, Input } from '@angular/core';
import { FormGroup } from '@angular/forms';
@Component({
    selector: 'fieldform',
    templateUrl: 'fieldform.component.html'
})
export class FieldFormComponent implements OnInit {
    @Input('group')
    public fieldForm: FormGroup;
    constructor() { }

    ngOnInit() { }
}

HTML

<div [formGroup]="fieldForm">
     <!-- Angular assigns array index as group name by default 0, 1, 2, ... -->
    <div class="form-group">
        <!--name-->
        <label class="col-lg-2 control-label">Attribute</label>
        <div class="col-lg-4">
            <input class="form-control"  id="inputName-{{i}}" type="text" formControlName="name">
            <!--display error message if street is not valid-->
            <small [hidden]="fieldForm.controls.name.valid">
                name is required
            </small>
        </div>
        <!--datatype-->
        <div class="col-lg-4">
            <select class="form-control" formControlName="datatype">
                <option>string</option>
                <option>number</option>
                <option>date</option>
            </select>
        </div>
    </div>
</div>

Я получаю следующую ошибку:

Ошибка: Uncaught (в обещании): Ошибка: ошибки синтаксического анализа шаблона: невозможно привязать к «ngForOf», так как это не известное свойство «div». ("

        <div formArrayName="fields">

            <div [ERROR ->]*ngFor="let field of myForm.controls.fields.controls; let i=index">

                <div [formGr"): ObjectConfigComponent@5:21 Property binding ngForOf not used by any directive on an embedded

шаблон. Убедитесь, что имя свойства написано правильно и все директивы перечислены в разделе «директивы». ("

        <div formArrayName="fields">

            [ERROR ->]<div *ngFor="let field of myForm.controls.fields.controls; let i=index">

                <div [f"): ObjectConfigComponent@5:16

Что я делаю не так.


person Akanksha Gaur    schedule 11.10.2016    source источник


Ответы (1)


Добавлять

imports: [CommonModule]

в @NgModule(...), который содержит ваш компонент. Не забудьте также импортировать пакет:

import { CommonModule } from "@angular/common";
person Günter Zöchbauer    schedule 11.10.2016
comment
Это так нехорошо... Я начал сомневаться в своем здравом уме. Сообщение об ошибке определенно должно предлагать что-то в этом роде, потому что крайне нелогично думать, что чего-то не хватает... (Я также позволил себе исправить тип в вашем ответе - надеюсь, все в порядке.) - person Konrad Viltersten; 25.08.2017
comment
Спасибо за исправление. Трудно сделать лучшее сообщение об ошибке. NgForOf является директивой, как и любая другая. Вы можете использовать директиву из другого пакета. После того, как вы привыкли к Angular, должно быть понятно, что имеется в виду и как исправить это сообщение об ошибке. - person Günter Zöchbauer; 25.08.2017