РЕДАКТИРОВАТЬ: Он по-прежнему не работает и не выдает никаких ошибок.Я отредактировал код и добавил частичный код из parent.component.ts
У меня есть родительский компонент боковой панели навигации и дочерний компонент, который вложен в тело родительского компонента и содержит iframe.Я хочу, чтобы при появлении события клика в iframe я возвращал родителю это событие, поэтому я могу пометить это видео как просмотренное на боковой панели родителя буквой 'V'.
родительский компонент.ts
// .....
export class CoursePlayComponent implements OnInit {
course: ICourse;
courseId: number;
// current user
public currentUser: IUser;
// variables for current lesson
public current: IVideo;
constructor(private courseService: CourseService,
private route: ActivatedRoute,
private router: Router,
private userService: UserService) {
this.currentUser = JSON.parse(localStorage.getItem('currentUser'));
}
ngOnInit() {
// save this course id from course-detail and get http request from the service
this.courseId = JSON.parse(localStorage.getItem("courseId"));
this.getCourse(this.courseId);
}
// get course by id from service
getCourse(id:number) {...}
// get current lesson by unit and lesson position in course
getCurrent(unit_position: number, lesson_position: number) { ... }
// check if the lesson already watched
isLessonIncluded(course_id: number, lesson_id: number) {
return this.userService.isLessonIncluded(course_id, lesson_id);
}
// check the value from child lesson and add the new lesson to the completed lessons array
watched(state) {
console.log("parent-video watched: ", state);
// update user data array
this.userService.addToCompletedLessons(this.course.id, this.current.id);
}
}
parent.component.html:
<mat-sidenav-container fullscreen *ngIf="course">
<mat-sidenav #sidenav mode="side" class="app-sidenav">
<mat-toolbar id="sidenav" color="primary">
<button mat-icon-button (click)="sidenav.toggle()" class="mat-icon-button sidenav-toggle-button" [hidden]="!sidenav.opened">
<mat-icon aria-label="Menu" class="material-icons">close</mat-icon>
</button>
</mat-toolbar>
<mat-nav-list *ngFor="let unit of course.units">
<h6 class="course-list-title">Unit {{ unit?.position }}: {{ unit?.name }}</h6>
<a mat-list-item *ngFor="let lesson of unit.videos" class="sidenav-link course-item" [routerLink]="['/courses' , course?.id , 'unit' , unit?.position , 'lesson' , lesson?.position]" (click)="sidenav.toggle()" (click)="getCurrent(unit?.position,lesson?.position)">
<span mat-line class="title">Lesson {{lesson?.id}}: {{lesson?.name}}</span>
<span *ngIf="isLessonIncluded(course.id, lesson.id)" class="fas fa-check" style="color:lightgreen;"></span>
</a>
</mat-nav-list>
</mat-sidenav>
<!-- ... -->
<div class="course-body container-fluid text-center">
<course-lesson *ngIf="showLesson == true" (clicked)="watched($event)" [lessonId]="current?.id" [lessonName]="current?.name" [lessonData]="current?.data" [totalLesoons]="totalLesoons"></course-lesson>
</div>
</mat-sidenav-container>
child.component.ts:
// ....
export class CourseLessonComponent implements OnInit {
@Input() lessonId: number;
@Input() lessonName: string;
@Input() lessonData: string;
@Input() totalLesoons: number;
@Output() clicked = new EventEmitter();
clicked: boolean = false;
constructor(private courseService: CourseService,
private route: ActivatedRoute,
private router: Router) { }
ngOnInit() { }
watchedVideo() {
console.log("child- video watched");
this.clicked.emit(true);
}
}
child.component.html:
<h1 class="lesson-title">{{lessonName}}</h1>
<p class="small-text" *ngIf="totalLesoons > 0">lesson {{lessonId}} of {{totalLesoons}}</p>
<hr>
<iframe (click)="clicked = true" frameborder="0" allowfullscreen="true" [src]='lessonData | safe'></iframe>