【发布时间】:2021-01-19 13:32:00
【问题描述】:
在我的 Angular quiz app 中,我的两个问题组件(MultipleAnswerComponent)都有相同的逻辑:option.selected && option.correct 和 option.selected && !option.correct > 和 SingleAnswerComponent) 模板,所以我移出了逻辑并在 QuizService 中添加了两个变量以共享/减少重复代码:
setOptions(optionSelected: boolean, optionCorrect: boolean): void {
this.isCorrectOption = optionSelected && optionCorrect;
this.isIncorrectOption = optionSelected && !optionCorrect;
}
我还用类绑定中的变量替换了逻辑,如下所示:[class.is-correct]="isCorrectOption" 和 [class.is-incorrect]="isIncorrectOption",但是所有选项都变红了,所以我更改了 mat-checkbox/ 上的背景颜色mat-radio-button 到 $light-gray !important 现在它是灰色的。当我单击某个选项时,绿色或红色背景未按预期显示。
编辑: 我在 QuizService 中获得了 isCorrectOption 和 isIncorrectOption 的正确值,并将这些值传递回组件。然而现在所有的选项在点击一个选项时显示为绿色/红色;我只需要 selected 选项 来获得背景颜色。不确定 isCorrectOption 和 isIncorrectOption 是否正确绑定到类绑定,或者我使用的逻辑是否不正确...
我尝试按照以下答案中的建议进行操作,但出现错误:无法读取未定义的“已选择”。我目前的解决方案非常接近解决方案,但我仍然需要一些额外的帮助才能使个人突出显示正常工作。请你看看我的 StackBlitz 并帮我解决这个问题。谢谢。
在 MultipleAnswerComponent/SingleAnswerComponent 模板中:
<div class="options" *ngFor="let option of currentQuestion.options; index as i">
<div *ngIf="multipleAnswer" or *ngIf="!multipleAnswer">
<mat-checkbox or <mat-radio-button
(change)="setSelected(i)"
[class.is-correct]="isCorrectOption"
[class.is-incorrect]="isIncorrectOption">
在 MultipleAnswer/SingleAnswer TypeScript 文件中:
setSelected(optionIndex: number): void {
this.quizStarted = true;
this.isCorrectAnswerSelected = this.isCorrect(this.currentQuestion.options[optionIndex].correct, optionIndex);
this.answer.emit(optionIndex);
if (this.correctAnswers.length === 1) {
this.currentQuestion.options.forEach((option: Option) => option.selected = false);
}
this.currentQuestion.options[optionIndex].selected = true;
if (
optionIndex >= 0 &&
this.currentQuestion &&
this.currentQuestion.options &&
this.currentQuestion.options[optionIndex]["correct"]
) {
optionIndex = null;
this.optionCorrect = true;
this.timerService.stopTimer();
this.quizService.correctSound.play();
} else {
this.optionCorrect = false;
this.quizService.incorrectSound.play();
}
this.quizService.setOptions(true, this.optionCorrect);
this.isCorrectOption = this.quizService.isCorrectOption;
this.isIncorrectOption = this.quizService.isIncorrectOption;
this.alreadyAnswered = true;
}
【问题讨论】:
-
请使用--background-color: $light-gray !important;
-
-
可能是根变量的颜色为红色,这就是它没有改变的原因。我不明白你的评论。
-
选项的背景颜色应根据每个选项的正确/错误从灰色变为绿色或灰色变为红色。我不认为逻辑正在执行......
-
我想出了如何传递值。在 MultipleAnswerComponent 和 SingleAnswerComponent 中添加了 console.log 并获得 optionSelected: 'true' 和 optionCorrect: 'true' 正确答案值和 optionSelected: 'true' 和 optionCorrect: 'undefined' 错误答案,并且得到相同的值从测验服务。接近解决这个问题,仍然需要帮助来改变背景颜色。请看我的 Stackblitz。
标签: css angular css-selectors logic ng-class