L'utilisation d'Angular.js et de Ionic ne permet pas d'utiliser Swiper en utilisant la structure classique du framework. L'élément <ion-content>, presque indispensable dans Ionic, empêche en effet le bon fonctionnement de Swiper.
Cependant, Ionic a tout de même intégré le framework par le biais de l'élément <ion-slides>.
À l'inverse d'une utilisation classique de Swiper, nous devons aborder l'initialisation du slider d'une manière différente.
<ion-slides ng-if="[__CONDITION__]" options="swiper.options" slider="[__ID_DU_SLIDER__]">
<ion-slide-page ng-repeat="[__REPEAT__]" >
<!-- Slide content -->
</ion-slide-page>
</ion-slides>
Pour conditionner l'affichage du slider, il est obligatoire de passer par la directive ng-if et non pas ng-show. En effet, ng-if ne va inclure le HTML qu'au moment où le contenu des slides sera chargé dans le $scope là où ng-show ne ferait que cacher l'élément avec une classe CSS.
Or Swiper a besoin d'être initialisé après que le contenu soit arrivé dans le DOM, et ce afin d'éviter certains bugs notamment présents lors de l'utilisation de l'autoplay.
Pour éviter des bugs d'affichage, il ne faut surtout pas oublier d'inclure les feuilles de style dans le fichier index.html :
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.1.0/css/swiper.min.css">
C'est dans le controller que la logique d'utilisation de Swiper est réellement bouleversée. Personnellement, je préfère tout organiser sous la forme d'un objet :
$scope.swiper = {
instance : '',
options : {
loop: true,
speed: 300,
autoplay: 5000,
autoplayStopOnLast : false,
onInit: function(swiper){
$scope.swiper.instance = swiper;
}
},
navigation : {
next : function(){
$scope.swiper.instance.slideNext();
},
prev : function(){
$scope.swiper.instance.slidePrev();
}
}
};
L'instance du slider va permettre d’accéder à l'objet et d’interagir avec par le biais des méthodes décrites ici (v3). Pour initialiser l'instance, on utilise la propriété onInit des options du Swiper ($scope.swiper.options.onInit).
Le callback appelé lors de la fin de la fonction permet de stocker l'instance dans la propriété instance.
Les boutons de navigation du slider changent aussi dans leur façon d'être initialisés. Au lieu de passer par l'objet options.navigation, nous devons utiliser l'instance du slider et les méthodes slideNext() et slidePrev() appelée par le biais de la directive ng-click depuis la vue.
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.1.0/css/swiper.min.css">
<ion-slides ng-if="stickyPosts" options="swiper.options" slider="postSlider" does-continue="true">
<ion-slide-page ng-repeat="post in stickyPosts" >
<div ng-include="'templates/subtemplates/card.html'"></div>
</ion-slide-page>
</ion-slides>
<div class="button button-positive" ng-click="swiper.navigation.prev()">
Précédent
</div>
<div class="button button-positive" ng-click="swiper.navigation.next()">
Suivant
</div>$scope.swiper = {
instance : '',
options : {
loop: true,
speed: 300,
autoplay: 5000,
autoplayStopOnLast : false,
onInit: function(swiper){
$scope.swiper.instance = swiper;
}
},
navigation : {
next : function(){
$scope.swiper.instance.slideNext();
},
prev : function(){
$scope.swiper.instance.slidePrev();
}
}
};