(nearOfTop)="onNearOfTop()" (nearOfBottom)="onNearOfBottom()" (pageChanged)="onPageChanged($event)"
class="videos" #videosElement
>
- <div *ngFor="let videos of videoPages" class="videos-page">
- <my-video-miniature *ngFor="let video of videos" [video]="video" [user]="user" [ownerDisplayType]="ownerDisplayType"></my-video-miniature>
+ <div *ngFor="let videos of videoPages; trackBy: pageByVideoId" class="videos-page">
+ <my-video-miniature *ngFor="let video of videos; trackBy: videoById" [video]="video" [user]="user" [ownerDisplayType]="ownerDisplayType"></my-video-miniature>
</div>
</div>
</div>
if (this.resizeSubscription) this.resizeSubscription.unsubscribe()
}
+ pageByVideoId (index: number, page: Video[]) {
+ // Video are unique in all pages
+ return page[0].id
+ }
+
+ videoById (index: number, video: Video) {
+ return video.id
+ }
+
onNearOfTop () {
this.previousPage()
}
const min = this.minPageLoaded()
if (min > 1) {
- this.loadMoreVideos(min - 1)
+ this.loadMoreVideos(min - 1, true)
}
}
<div class="video-miniature">
- <my-video-thumbnail [video]="video" [nsfw]="isVideoBlur()"></my-video-thumbnail>
+ <my-video-thumbnail [video]="video" [nsfw]="isVideoBlur"></my-video-thumbnail>
<div class="video-miniature-information">
<a
tabindex="-1"
class="video-miniature-name"
- [routerLink]="[ '/videos/watch', video.uuid ]" [attr.title]="video.name" [ngClass]="{ 'blur-filter': isVideoBlur() }"
+ [routerLink]="[ '/videos/watch', video.uuid ]" [attr.title]="video.name" [ngClass]="{ 'blur-filter': isVideoBlur }"
>
{{ video.name }}
</a>
-import { Component, Input, OnInit } from '@angular/core'
+import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'
import { User } from '../users'
import { Video } from './video.model'
import { ServerService } from '@app/core'
@Component({
selector: 'my-video-miniature',
styleUrls: [ './video-miniature.component.scss' ],
- templateUrl: './video-miniature.component.html'
+ templateUrl: './video-miniature.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush
})
export class VideoMiniatureComponent implements OnInit {
@Input() user: User
@Input() video: Video
@Input() ownerDisplayType: OwnerDisplayType = 'account'
+ isVideoBlur: boolean
+
private ownerDisplayTypeChosen: 'account' | 'videoChannel'
constructor (private serverService: ServerService) { }
} else {
this.ownerDisplayTypeChosen = 'videoChannel'
}
- }
- isVideoBlur () {
- return this.video.isVideoNSFWForUser(this.user, this.serverService.getConfig())
+ this.isVideoBlur = this.video.isVideoNSFWForUser(this.user, this.serverService.getConfig())
}
displayOwnerAccount () {
import { NgModuleRef, ApplicationRef } from '@angular/core'
import { createNewHosts } from '@angularclass/hmr'
+import { enableDebugTools } from '@angular/platform-browser'
export const hmrBootstrap = (module: any, bootstrap: () => Promise<NgModuleRef<any>>) => {
let ngModule: NgModuleRef<any>
module.hot.accept()
bootstrap()
- .then(mod => ngModule = mod)
+ .then(mod => {
+ ngModule = mod
+
+ const applicationRef = ngModule.injector.get(ApplicationRef);
+ const componentRef = applicationRef.components[ 0 ]
+ // allows to run `ng.profiler.timeChangeDetection();`
+ enableDebugTools(componentRef)
+ })
module.hot.dispose(() => {
const appRef: ApplicationRef = ngModule.injector.get(ApplicationRef)
const elements = appRef.components.map(c => c.location.nativeElement)