ngFor Angular 2+中未加载索引

时间:2018-12-11 02:03:51

标签: angular ngfor angular-forms

上下文

我在Angular 6的 formGroup 中有一个 formArray ,并且有一些函数可以与数组的元素进行交互,例如(component.ts):

form: FormGroup

constructor(private builder: FormBuilder) { }

ngOnInit() {
  this.form = this.builder.group({
    ingreso: '',
    salida: '',
    habitaciones: this.builder.array([])
  })
}

get habitacionForms() {
  return this.form.get('habitaciones') as FormArray;
}

addHabitacion() {
  var habitacion = this.builder.group({
    tipo: '',
    piso: '',
    numero: '',
  })
  this.habitacionForms.push(habitacion);
}

deleteHabitacion(habIndex) {
  this.habitacionForms.removeAt(habIndex)
}

视图(component.html)是:

<!-- Form starts here -->
    <form class="form-horizontal" [formGroup]="form" (ngSubmit)="submitHabitacion()">
      <div class="box-body">

        <div class="form-group">
          <label for="ingreso" class="col-sm-2 control-label">Fecha de ingreso</label>
          <div class="col-sm-8">
            <input type="date" class="form-control" formControlName="ingreso" id="ingreso" placeholder="">
          </div>
        </div>

        <div class="form-group">
          <label for="salida" class="col-sm-2 control-label">Fecha de salida</label>
          <div class="col-sm-8">
            <input type="date" class="form-control" formControlName="salida" id="salida" placeholder="">
          </div>
        </div>

        <!-- Habitaciones -->
        <div class="col-md-9 col-md-offset-1">
          <div class="box box-primary" *ngFor="let habitacion of habitacionForms.controls; let i = index"
      [formGroupName]="i">
      {{i}}
        <div class="box-header with-border">
          <h3 class="box-title">Habitación #{{i + 1}}</h3>
          <button type="button" class="btn btn-danger" style="margin: 2px; margin-left: 6%"
          (click)="deleteHabitacion(habIndex)">Eliminar</button>
        </div>

        <div class="box-body">
          <div class="form-group">
            <label for="tipo" class="col-sm-2 control-label">Tipo</label>
            <div class="col-sm-8">
              <input type="text" class="form-control" formControlName="tipo" id="tipo" placeholder="">
            </div>
          </div>

          <div class="form-group">
            <label for="piso" class="col-sm-2 control-label">Piso</label>
            <div class="col-sm-8">
              <input type="text" class="form-control" formControlName="piso" id="piso" placeholder="">
            </div>
          </div>

          <div class="form-group">
            <label for="numero" class="col-sm-2 control-label">Número</label>
            <div class="col-sm-8">
              <input type="numero" class="form-control" formControlName="numero" id="numero" placeholder="">
            </div>
          </div>
        </div>

        <div class="box-footer">
          <button type="submit" class="btn btn-success col-md-6 col-md-offset-3">Agregar cliente</button>
        </div>

      </div>
    </div>

    <button type="button" class="btn btn-warning col-md-7 col-md-offset-2"
      (click)="addHabitacion()">Agregar habitación</button>

      </div>

      <div class="box-footer">
        <button type="submit" class="btn btn-primary col-md-9 col-md-offset-1">Agregar nueva reserva</button>
      </div>

    </form>

问题

当我运行程序并按下“ Agregar Habitacion”按钮时,该按钮应该在 formArray 上创建一个新元素,它将正确地将该元素添加到“ habitacion” formArray ,但跳过此错误:

“错误:找不到具有未指定名称属性的控件     在_throwError(forms.js:1799)     在setUpFormContainer(forms.js:1781)...“

错误在与* ngFor指令行相对应的第28行中跳转。 似乎索引没有加载,因为显示索引的标签只有在将值放入生成的 formArray 实例的输入中才可以检索到索引,并且神奇地找到并显示了索引,索引才可以检索到。

1 个答案:

答案 0 :(得分:1)

我解决了!我忘了在* ngFor指令的父 div 中添加 formArrayName =“ habitaciones” ,在我迭代 formArray 的地方。这就是为什么它无法识别 formArray 以及为什么不加载* ngFor的索引的原因。我不好,但这也许对某人有帮助。