#angular #templates #data-binding #scope
#angular #шаблоны #привязка к данным #область действия
Вопрос:
У меня есть angular ng-template, который правильно присваивает значение индекса formControlName, когда шаблон находится внутри его родительского FormArray, но не может этого сделать при перемещении за пределы массива.
Работает следующее:
<div formArrayName="searchLimits" *ngIf="!sectionCollapseState?.searchLimits">
<!-- template inside array -->
<ng-template #checkboxSetTemplate let-upper="displayCount" let-sectionName="sectionName">
<div *ngFor="let item of [0, 1]; let i = index;"
class="col-md-12">
<label [ngClass]="this.modelService.getClassMap(item)">
<!-- 'ng-reflect-name' is assigned 'i' in rendered page, as expected -->
<input type="checkbox" [formControlName]="i" />
...
</label>
</div>
</ng-template>
</div>
но следующее не:
<div formArrayName="searchLimits" *ngIf="!sectionCollapseState?.searchLimits">
</div>
<!-- template outside of array -->
<ng-template #checkboxSetTemplate let-upper="displayCount" let-sectionName="sectionName">
<div *ngFor="let item of [0, 1]; let i = index;"
class="col-md-12">
<label [ngClass]="this.modelService.getClassMap(item)">
<!-- 'ng-reflect-name' is assigned 'i' in rendered page, as expected -->
<input type="checkbox" [formControlName]="i" />
...
</label>
</div>
</ng-template>
Следующая директива, которая находится внутри массива, использует приведенный выше шаблон:
<div>
<ng-template [ngTemplateOutlet]="checkboxSetTemplate" [ngTemplateOutletContext]="{displayCount: SearchLimits?.length,
sectionName: SearchLimits}">
</ng-template>
</div>
Связанный машинописный текст:
private buildForm() {
this.searchForm = new FormGroup({
refinements: this.formBuilder.group({
searchLimits: this.formBuilder.array([]),
keywords: new TextboxControl(null)
})
}, this.searchService.formHasUserDataValidator());
}
Может кто-нибудь, пожалуйста, дайте мне знать, как я могу создать рабочий шаблон вне области действия массива?
Большое вам спасибо,
Стержень
Комментарии:
1. попробуйте использовать
[formControl]="searchLimits.at(i)"
(если у вас есть getter searchLimits, которые возвращают FormArray) или[formControl]="yourForm.get('searchLimits' i)"
2. Спасибо за ваш комментарий, Элизео. Я сделал так, как вы предлагаете, но это не работает. На самом деле, значение ‘i’ доступно в моем исходном коде, но не присваивается ‘FormControl’. При выполнении неисправного кода генерируется сообщение «Не удается найти элемент управления с помощью пути «уточнения -> 0».
3. извините, это
[formControl]="yourFrom.get('searchLimits.' i)"
— см. Точку в конце «searchLimits»
Ответ №1:
Поскольку formControlName находится за пределами родительской FormGroup, он не работает.
Попробуйте это:
измените [formControlName] ===> [FormControl] .
<!-- template outside of array -->
<ng-template #checkboxSetTemplate let-upper="displayCount" let-sectionName="sectionName">
<div *ngFor="let item of [0, 1]; let i = index;"
class="col-md-12">
<label [ngClass]="this.modelService.getClassMap(item)">
<!-- 'ng-reflect-name' is not present in rendered page, but is expected -->
<input type="checkbox" [formControl]="i" />
...
</label>
</div>
</ng-template>
Комментарии:
1. Спасибо за ваш ответ. Я внес это изменение, но результат тот же. Я добавлю машинописный текст, показывающий структуру, к моему исходному сообщению.
2. Если это возможно, можете ли вы создать stackblitz?