#angular #swiper #swiperjs #swiper.js
#angular #swiper #swiperjs #swiper.js
Вопрос:
У меня есть вложенный слайдер (один вертикальный, родительский и один горизонтальный, дочерний), и я хотел бы сбросить индекс дочернего элемента при изменении родительского индекса. Слайды создаются динамически на основе списка объектов.
Может быть, кто-нибудь может подсказать мне, как получить текущий горизонтальный указатель, чтобы я мог получить доступ к его индексу и изменить его?
Спасибо всем 🙂
swiper-homepage.component.html:
<div>
<div class="col-10 offset-1 col-md-3 offset-md-4 col-lg-3 offset-lg-4 col-xl-4 offset-xl-4 center">
<div class="card">
<swiper #verticalSwiper [config]="verticalConfig" (swiper)="onVerticalSwiper($event)"
(slideChange)="onVerticalSlideChange($event)" (transitionEnd)="onVerticalTransitionEnd($event)"
(transitionStart)="onTransictionStart($event)">
<ng-template swiperSlide *ngFor="let company of companies">
<div class="text-white">
<swiper [attr.ib]="'horSwiper' currentCompanyIndex" [config]="horizontalConfig"
(swiper)="onHorizontalSwiper($event)" (transitionEnd)="onHorizontalTransitionEnd($event)"
(slideChange)="onHorizontalSlideChange($event)">
<ng-template swiperSlide>
<detail-slide [company]="company">
</detail-slide>
</ng-template>
<ng-template swiperSlide *ngFor="let multimedia of company.multiMedia">
<img [src]="multimedia.mediaURL" class="card-img center-page-image" alt="...">
<div class="card-img-overlay lower-third-company-name">
<button type="button" class="btn btn-light" (click)="goToPage('detail')">{{
company.companyName }}</button>
<p class="card-text description-with-top-margin">{{ company.companyDescription }}</p>
</div>
</ng-template>
</swiper>
</div>
</ng-template>
</swiper>
</div>
swiper-homepage.components.ts:
import { Component, OnInit, ViewChild } from '@angular/core';
import { Router } from '@angular/router';
import { withLatestFrom } from 'rxjs';
import { RouterControllerComponent } from 'src/app/component/router-controller/router-controller.component';
import { GestureController } from 'src/app/interfaces/gesture-controller';
import { Company } from 'src/app/object/company';
import { CompanyService } from 'src/app/service/company.service';
import SwiperCore, { Swiper, SwiperOptions } from 'swiper';
import { SwiperComponent } from 'swiper/angular';
@Component({
selector: 'app-swiper-homepage',
templateUrl: './swiper-homepage.component.html',
styleUrls: ['./swiper-homepage.component.css']
})
export class SwiperHomepageComponent extends RouterControllerComponent implements OnInit{
verticalConfig: SwiperOptions = {
slidesPerView: 1,
spaceBetween: 50,
direction: 'vertical',
preloadImages: false,
// Enable lazy loading
lazy: true,
initialSlide: 0
};
horizontalConfig: SwiperOptions = {
slidesPerView: 1,
spaceBetween: 50,
direction: 'horizontal',
preloadImages: false,
// Enable lazy loading
lazy: true,
observeParents: true,
initialSlide: 1
}
private currentHorizontalSwiper = new Swiper('', {});
public currentCompanyIndex = 0;
public isReadyToDetail = false;
public companies: Company[] = [];
constructor(
private readonly companyService: CompanyService,
readonly router: Router
) {
super(router);
}
ngOnInit(): void {
this.loadPage();
}
//TODO manage the company arrangement, allow infinite
loadPage(){
this.companyService.getAllCompanies().subscribe(gettedCompanies =>{
this.companies = gettedCompanies;
});
}
onVerticalSwiper(swiper: any) {
console.log(swiper);
}
onHorizontalSwiper(swiper: any) {}
onVerticalSlideChange(swiper: any) {
console.log(swiper);
}
onHorizontalSlideChange(swiper: any) {
this.currentCompanyIndex = swiper.activeIndex;
if(swiper.activeIndex === 0)
this.isReadyToDetail = true;
}
onVerticalTransitionEnd(swiper: any){
console.log("END");
console.log(swiper);
}
onHorizontalTransitionEnd(swiper: any){
if(swiper.activeIndex === 0)
this.isReadyToDetail = true;
}
onTransictionStart(swiper: any){
console.log("START");
console.log(swiper);
}
onBeforeTransiction(swiper: any){
console.log("BEFORE START");
console.log(swiper);
}
//TODO capire come funzionano gli observer, per resettare i vari index
}
Комментарии:
1. Привет, не хотите ли вы получить экземпляр слайдера из swiper при инициализации? Вы можете кэшировать экземпляр как одно из свойств в вашем классе и получить к нему доступ в onVerticalSlideChange?
2. Эй, вы можете привести мне какой-нибудь пример? Спасибо!
3. Это может помочь: swiperjs.com/angular#accessing-swiper-reference Здесь this.swiper является ссылкой на экземпляр
4. О, хорошо, но основная проблема в том, что у меня есть несколько горизонтальных свайперов, которые создаются на основе ответа серверной части. Я думаю, что я не могу использовать эту функцию @ViewChild для этого: (
Ответ №1:
Поскольку у нас не будет доступа к динамически создаваемым экземплярам swiper, мы можем рассмотреть возможность создания компонента-оболочки Angular (который, в свою очередь, отображает swiper, беря реквизиты из цикла) и отображать его в вашем цикле. Когда когда-либо изменится ваш родительский слайдер, используйте предпочитаемый механизм событий Angular для оповещения всех компонентов оболочки, чтобы они сбросили себя.
Когда мы передаем реквизиты swiper компоненту-оболочке, мы можем использовать @ViewChild, чтобы получить экземпляр swiper
Комментарии:
1. Хорошо, я постараюсь и дам вам знать. Спасибо!
2. Не могли бы вы привести какой-нибудь пример кода? У меня возникли некоторые проблемы: (
3. Я не сторонник angular, это может привести к проблемам с синтаксисом. Попробую завтра.
4. Это здорово! Извиняюсь, у меня не было времени поработать над этим.
5. Нет, это не повлияет на проблему с производительностью. Убедитесь, что у вас нет ненужных реактивных / подписок в оболочке.