如何根据 quizId 路由到特定的测验?
How can I route to a specific quiz based on quizId?
我正在做一个测验-selection 组件。我希望它根据外部 quiz.ts 文件中 QUIZ_DATA 数组中的 quiz.id 路由到特定测验,例如 TS-Quiz 或 DI-Quiz。当我点击 TypeScript Quiz (TS-Quiz) 时,我得到了 DI-Quiz 介绍;应该是TS-Quiz的介绍信息。不确定如何使用传递给 [routerLink] 中的 IntroductionComponent 的 quiz.id 类型。
加载测验中的第一个问题时出现此错误:
类型错误:无法读取未定义的 属性“0”
我希望 select 页面首先(完成),然后是介绍(基于 quiz.id),然后是问题(基于 quiz.id),然后结果。
请在 Stackblitz 上查看我的 运行 应用程序:https://stackblitz.com/edit/angular-10-quiz-app
我的[routerLink]如下:
<mat-grid-tile *ngFor="let quiz of quizData"
[routerLink]="['/quiz/intro', quiz.id]"
[ngStyle]="{ 'background': 'url(' + quiz.imageUrl + ') no-repeat center top',
'background-size': '380px 275px' }">
我的 IntroductionComponent 看起来像:
<ng-container *ngFor="let quiz of quizData">
<mat-card *ngIf="quiz.id === 'DI_Quiz'">
<mat-card-header>
<div mat-card-avatar class="header-image"></div>
<mat-card-title i18n>{{ quiz.milestone }} Quiz</mat-card-title>
<mat-card-subtitle i18n>
<span>How well do you know {{ quiz.milestone }}?</span>
<span>Take the quiz and find out!</span>
</mat-card-subtitle>
</mat-card-header>
...
<mat-card-actions>
<button class="btn btn-outline-primary" routerLink="/quiz/question/1">
<span i18n><strong>Start the Quiz!</strong></span>
</button>
</mat-card-actions>
这是我在测验中的路由设置-routing.module.ts:
const routes: Routes = [
{ path: '', redirectTo: 'select' },
{ path: 'select', component: QuizSelectionComponent },
{ path: 'intro', component: IntroductionComponent },
{ path: 'intro/:id', component: IntroductionComponent },
{ path: 'question', component: QuizComponent },
{ path: 'question/:questionIndex', component: QuizComponent },
{ path: 'results', component: ResultsComponent }
];
查看 quiz.component.ts
,在 getQuestion (line 85)
方法中,测验服务的 getQuestions
方法 returns 是一个数组,而不是一个对象。因此,属性 个问题将是未定义的。
似乎缺少测验 ID,您需要获取测验 ID 才能获取该测验的问题,如下所示:
this.question = this.quizService.getQuestions()[indexOfQuizId].questions[this.questionIndex - 1];
要获得indexOfQuizId
,一种方法是将问题页面的路径更改为:
{ path: 'question/:quizId/:questionIndex', component: QuizComponent, pathMatch: 'full' },
然后用类似的东西得到测验的索引:
const quizId = this.activatedRoute.snapshot.paramMap.get('quizId');
const indexOfQuizId = this.quizData.findIndex(el => el.id === quizId);
当然还有其他方法,这只是一种方法。
希望对您有所帮助。
路由参数获取方式如下,
更新您的 introduction.component.ts
如下所示,
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { QUIZ_DATA } from '../../shared/quiz';
import { Quiz } from '../../shared/models/Quiz.model';
import { Router, ActivatedRoute, ParamMap } from '@angular/router';
@Component({
selector: 'codelab-quiz-intro',
templateUrl: './introduction.component.html',
styleUrls: ['./introduction.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class IntroductionComponent {
quizData: Quiz = QUIZ_DATA;
quizName: String = '';
constructor(
private route: ActivatedRoute,
) {}
ngOnInit() {
this.route.url.subscribe(segments => {
this.quizName = segments[1].toString();
});
}
}
更新 introduction.component.html
中的 mat-card *ngIf
,如下所示,
<mat-card *ngIf="quiz.id === quizName">
这将有助于根据所选测验正确导航到所需的介绍页面。这是一个StackBlitz
我正在做一个测验-selection 组件。我希望它根据外部 quiz.ts 文件中 QUIZ_DATA 数组中的 quiz.id 路由到特定测验,例如 TS-Quiz 或 DI-Quiz。当我点击 TypeScript Quiz (TS-Quiz) 时,我得到了 DI-Quiz 介绍;应该是TS-Quiz的介绍信息。不确定如何使用传递给 [routerLink] 中的 IntroductionComponent 的 quiz.id 类型。
加载测验中的第一个问题时出现此错误: 类型错误:无法读取未定义的 属性“0”
我希望 select 页面首先(完成),然后是介绍(基于 quiz.id),然后是问题(基于 quiz.id),然后结果。
请在 Stackblitz 上查看我的 运行 应用程序:https://stackblitz.com/edit/angular-10-quiz-app
我的[routerLink]如下:
<mat-grid-tile *ngFor="let quiz of quizData"
[routerLink]="['/quiz/intro', quiz.id]"
[ngStyle]="{ 'background': 'url(' + quiz.imageUrl + ') no-repeat center top',
'background-size': '380px 275px' }">
我的 IntroductionComponent 看起来像:
<ng-container *ngFor="let quiz of quizData">
<mat-card *ngIf="quiz.id === 'DI_Quiz'">
<mat-card-header>
<div mat-card-avatar class="header-image"></div>
<mat-card-title i18n>{{ quiz.milestone }} Quiz</mat-card-title>
<mat-card-subtitle i18n>
<span>How well do you know {{ quiz.milestone }}?</span>
<span>Take the quiz and find out!</span>
</mat-card-subtitle>
</mat-card-header>
...
<mat-card-actions>
<button class="btn btn-outline-primary" routerLink="/quiz/question/1">
<span i18n><strong>Start the Quiz!</strong></span>
</button>
</mat-card-actions>
这是我在测验中的路由设置-routing.module.ts:
const routes: Routes = [
{ path: '', redirectTo: 'select' },
{ path: 'select', component: QuizSelectionComponent },
{ path: 'intro', component: IntroductionComponent },
{ path: 'intro/:id', component: IntroductionComponent },
{ path: 'question', component: QuizComponent },
{ path: 'question/:questionIndex', component: QuizComponent },
{ path: 'results', component: ResultsComponent }
];
查看 quiz.component.ts
,在 getQuestion (line 85)
方法中,测验服务的 getQuestions
方法 returns 是一个数组,而不是一个对象。因此,属性 个问题将是未定义的。
似乎缺少测验 ID,您需要获取测验 ID 才能获取该测验的问题,如下所示:
this.question = this.quizService.getQuestions()[indexOfQuizId].questions[this.questionIndex - 1];
要获得indexOfQuizId
,一种方法是将问题页面的路径更改为:
{ path: 'question/:quizId/:questionIndex', component: QuizComponent, pathMatch: 'full' },
然后用类似的东西得到测验的索引:
const quizId = this.activatedRoute.snapshot.paramMap.get('quizId');
const indexOfQuizId = this.quizData.findIndex(el => el.id === quizId);
当然还有其他方法,这只是一种方法。
希望对您有所帮助。
路由参数获取方式如下,
更新您的 introduction.component.ts
如下所示,
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { QUIZ_DATA } from '../../shared/quiz';
import { Quiz } from '../../shared/models/Quiz.model';
import { Router, ActivatedRoute, ParamMap } from '@angular/router';
@Component({
selector: 'codelab-quiz-intro',
templateUrl: './introduction.component.html',
styleUrls: ['./introduction.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class IntroductionComponent {
quizData: Quiz = QUIZ_DATA;
quizName: String = '';
constructor(
private route: ActivatedRoute,
) {}
ngOnInit() {
this.route.url.subscribe(segments => {
this.quizName = segments[1].toString();
});
}
}
更新 introduction.component.html
中的 mat-card *ngIf
,如下所示,
<mat-card *ngIf="quiz.id === quizName">
这将有助于根据所选测验正确导航到所需的介绍页面。这是一个StackBlitz