【发布时间】:2020-04-30 17:39:54
【问题描述】:
我正在创建一个测验应用程序,需要在 mat-checkbox 或 mat-radio-button 之间切换,具体取决于问题是否有一个或多个答案。问题 #1 是单选答案问题,使用 mat-radio-button 显示,而问题 #2 是多选问题,但也使用 mat-radio-button 而不是 mat-checkbox 显示。
这是我的模板的样子:
<form [formGroup]="formGroup">
<ol *ngIf="multipleAnswer === false">
// using mat-radio-buttons here
</ol>
<ol *ngIf="multipleAnswer === true">
// using mat-checkboxes here
</ol>
</form>
在我的 ts 文件中,逻辑如下:
multipleAnswer: boolean;
ngOnInit() {
this.multipleAnswer = this.quizService.getQuestionType();
}
ngOnChanges(changes: SimpleChanges) {
if (changes.question) {
switch (this.question.type) {
case 'SINGLE_CHOICE':
this.formGroup = new FormGroup({
answer: new FormControl([null, Validators.required])
});
break;
case 'MULTIPLE_CHOICE':
const multipleChoiceValidator = (control: AbstractControl) =>
control.value.reduce(
(valid: boolean, currentValue: boolean) => valid || currentValue
, false
) ? null : {answers: 'At least one answer needs to be checked!'};
this.formGroup = new FormGroup({
answers: this.formBuilder.array(this.question.shuffledAnswers
.map((answer: string) => this.formBuilder.control(false)),
multipleChoiceValidator
),
});
break;
}
}
}
不需要 shuffledAnswers,问题类型应该从 assets/quiz.ts 文件中推断出来(不需要硬编码问题类型),答案应该是数字,而不是字符串
在我的 QuizService 中:
getQuestionType(): boolean {
return (this.correctAnswers && this.correctAnswers.length === 1);
}
【问题讨论】:
-
我看不到你的完整代码,所以我猜。也许问题是您只在
ngOnInit内检查multipleAnswer一次。您是否尝试在ngOnChanges中检查它? -
是的,我将它添加到 ngOnChanges,但它似乎不起作用。
-
我添加了上面显示的新 ngOnChanges 代码,但在控制台中出现此错误:core.js:6237 ERROR NullInjectorError: R3InjectorError(QuizRoutingModule)[FormBuilder -> FormBuilder -> FormBuilder -> FormBuilder]: NullInjectorError: 没有 FormBuilder 的提供者!
-
抱歉,我不能说太多。也许如果您可以将相关部分分享为堆栈闪电战,我们可以对其进行检查。
-
请看我的stackblitz:stackblitz.com/edit/angular-9-quiz-app