import { Component, Input, Output, EventEmitter, ContentChild, TemplateRef, ViewChild } from '@angular/core'; import { Slides } from 'ionic-angular'; @Component({ selector: 'vb-virtual-slides', template: `
` }) export class VirtualBeamsVirtualSlides { @Input() public items: any[]; @Input() public pager: boolean; @Input() public set lockSwipeToNext(value: boolean) { if (typeof value === 'boolean' && this.slides) { this.slides.lockSwipeToNext(value); } } @Input() public set lockSwipeToPrev(value: boolean) { if (typeof value === 'boolean' && this.slides) { this.slides.lockSwipeToNext(value); } } @Output() public currentIndex: EventEmitter = new EventEmitter(); @Output() public onLoadSlides: EventEmitter = new EventEmitter(); @Output() public ionSlideAutoplay: EventEmitter = new EventEmitter(); @Output() public ionSlideAutoplayStart: EventEmitter = new EventEmitter(); @Output() public ionSlideAutoplayStop: EventEmitter = new EventEmitter(); @Output() public ionSlideDidChange: EventEmitter = new EventEmitter(); @Output() public ionSlideDoubleTap: EventEmitter = new EventEmitter(); @Output() public ionSlideDrag: EventEmitter = new EventEmitter(); @Output() public ionSlideNextEnd: EventEmitter = new EventEmitter(); @Output() public ionSlideNextStart: EventEmitter = new EventEmitter(); @Output() public ionSlidePrevEnd: EventEmitter = new EventEmitter(); @Output() public ionSlidePrevStart: EventEmitter = new EventEmitter(); @Output() public ionSlideReachEnd: EventEmitter = new EventEmitter(); @Output() public ionSlideReachStart: EventEmitter = new EventEmitter(); @Output() public ionSlideTap: EventEmitter = new EventEmitter(); @Output() public ionSlideWillChange: EventEmitter = new EventEmitter(); @ContentChild('content') content: TemplateRef; @ViewChild(Slides) public slides: Slides; indexDisplayed: number; start: number; end: number; renderItems: any[] = new Array(3); constructor() { } public initSlides() { const end = this.items.length > 2 ? 3 : this.items.length; this.indexDisplayed = 0; this.start = 0; this.end = end; this.renderItems = this.items.slice(0, end); this.emitCurrentIndex(); } ngOnInit() { this.onLoadSlides.emit(this.slides); this.initSlides(); } onSlideAutoplay(event: Slides) { this.ionSlideAutoplay.emit(event); } onSlideAutoplayStart(event: Slides) { this.ionSlideAutoplayStart.emit(event); } onSlideAutoplayStop(event: Slides) { this.ionSlideAutoplayStop.emit(event); } onSlideDidChange(event: Slides) { this.emitCurrentIndex(); this.ionSlideDidChange.emit(event); } onSlideDoubleTap(event: Slides) { this.ionSlideDoubleTap.emit(event); } onSlideDrag(event: Slides) { this.ionSlideDrag.emit(event); } onSlideNextEnd(event: Slides) { if (this.end < this.items.length) { if (event._activeIndex === 2) this.sliceOriginalArray(++this.start, ++this.end); this.indexDisplayed++; this.slides.slideTo(1, 0, false); } else if (this.indexDisplayed < (this.items.length - 1)) { this.indexDisplayed++; } this.slides.onlyExternal = false; this.ionSlideNextEnd.emit(event); } onSlideNextStart(event: Slides) { this.ionSlideNextStart.emit(event); } onSlidePrevEnd(event: Slides) { const next = event._activeIndex == 0 && this.start == 0 ? 0 : 1; if (this.start > 0 && event._activeIndex == 0) { this.sliceOriginalArray(--this.start, --this.end); } if (this.start < this.indexDisplayed) { this.indexDisplayed--; } this.lockSwipeToNext = false; this.slides.slideTo(next, 0, false); this.slides.onlyExternal = false; this.ionSlidePrevEnd.emit(event); } onSlidePrevStart(event: Slides) { this.ionSlidePrevStart.emit(event); } onSlideReachEnd(event: Slides) { this.ionSlideReachEnd.emit(event); } onSlideReachStart(event: Slides) { this.ionSlideReachStart.emit(event); } onSlideTap(event: Slides) { this.ionSlideTap.emit(event); } onSlideWillChange(event: Slides) { this.slides.onlyExternal = true; this.ionSlideWillChange.emit(event); } public getRealIndex(currentIndex: number): number { let realIndex = this.start; switch (currentIndex) { case 1: realIndex += 1; break; case 2: realIndex += 2; break; case 3: realIndex = this.end - 1; break; default: break; } return realIndex; } private sliceOriginalArray(start, end) { this.renderItems = this.items.slice(start, end); } private emitCurrentIndex(): void { const activeIndex = this.slides.getActiveIndex(); const realIndex = this.getRealIndex(activeIndex); this.currentIndex.emit(realIndex); } }