Удалите элемент управления формы из mat-radio-group
, поскольку вы присваиваете значение в методе setAnswer(answer : any)
конкретному элементу управления, назначать элемент управления группе не обязательно.
<mat-radio-group class="example-radio-group" [formControlName]="ctrls[currentQuestion]">
изменить наthis
<mat-radio-group class="example-radio-group">
Revision
Попытка привязать элемент управления формы к mat-radio-button
приводит к следующей ошибке.
ERRORОшибка: Нет доступа к значению для элемента управления формы с именем: 'func'
Причина этого в том, что mat-radio-button
не имеет директивы ControlValueAccessor
, и именно поэтому вы успешно использовали встроенные переключатели.
Директивы управления формой используют директиву ControlValueAccessor для связи с собственным элементом.Существуют разные типы ControlValueAccessors для каждого из возможных входов.Правильный выбирается селектором директивы accessor значения.Селекторы основаны на типе <input>
.Если у вас type = "radio", то будет использоваться средство доступа к значению для радио.
Объяснение из этого ответа
Angular2 Reactive Forms formControl для переключателей
В этом сценарии использование метода для установки значения в элементе управления будет правильным подходом ... если вы не хотите использовать метод для установки значения в formControl, вам необходимоиспользуйте собственные кнопки HTML, как вы делали раньше.
Редакция 2
Считывание последнего ответа на этот связанный вопрос SO далее, кажется, есть способ сделать это без использованиянативные кнопки HTML.
- Ключ здесь заключается в том, чтобы перебрать ваш
ctrls
и создать mat-radio-group
для каждого. - Затем вы должны использовать * ngIf для сравнения
index
до currentQuestion
, чтобы вы отображали только правильную группу на основе currentQuestion
. См. HTML ниже.
<code><mat-card>
<div id="questions-container">
<div class="arrows" (click)="previousQuestion()">
<div>
<</div>
</div>
<div class="question-container">
<form [formGroup]="form">
<h1>Question placeholder?</h1>
<div *ngFor="let ctrl of ctrls; let i = index">
<mat-radio-group *ngIf="currentQuestion == i" class="example-radio-group" [formControlName]="ctrl">
<mat-radio-button *ngFor="let answer of answers[currentQuestion]" [value]="answer.id">{{answer.label}}</mat-radio-button>
</mat-radio-group>
</div>
</form>
</div>
<div class="arrows" (click)="nextQuestion()">
<div>></div>
</div>
</div>
<p>{{currentQuestion}}</p>
<p>{{ctrls[currentQuestion]}}</p>
<pre>{{form.value | json}}