mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2026-03-13 10:22:08 +08:00
120 lines
3.1 KiB
JavaScript
120 lines
3.1 KiB
JavaScript
/**
|
|
* @ngdoc directive
|
|
* @name ionSlidePager
|
|
* @parent ionic.directive:ionSlideBox
|
|
* @module ionic
|
|
* @description
|
|
* Shows a pager for the slidebox.
|
|
*
|
|
* A pager is a row of small buttons at the bottom of the slidebox, each
|
|
* representing one slide. When the user clicks a pager, that slide will
|
|
* be selected.
|
|
*
|
|
* For more complete examples, see {@link ionic.directive:ionSlideBox}.
|
|
*
|
|
* @usage
|
|
* This will show four pager buttons, one for each slide.
|
|
*
|
|
* ```html
|
|
* <ion-slide-box>
|
|
* <ion-slide-pager></ion-slide-pager>
|
|
* <ion-slide>1</ion-slide>
|
|
* <ion-slide>2</ion-slide>
|
|
* <ion-slide>3</ion-slide>
|
|
* <ion-slide>4</ion-slide>
|
|
* </ion-slide-box>
|
|
* ```
|
|
*
|
|
* If you provide your own `ng-click` attribute, it overrides the default
|
|
* click behavior.
|
|
*
|
|
* ```html
|
|
* <ion-slide-box>
|
|
* <ion-slide-pager ng-click="doSomething($slideIndex)"></ion-slide-pager>
|
|
* <ion-slide>1</ion-slide>
|
|
* <ion-slide>2</ion-slide>
|
|
* <ion-slide>3</ion-slide>
|
|
* </ion-slide-box>
|
|
* ```
|
|
*
|
|
* @param {expression=} ng-click By default, clicking a pager will select the corresponding
|
|
* slide. You can override this by providing an ng-click expression. The ng-click
|
|
* expression will be provided a `$slideIndex` variable, signifying the slide index
|
|
* matching the click.
|
|
*/
|
|
IonicModule.directive('ionSlidePager', [
|
|
'$parse',
|
|
function($parse) {
|
|
return {
|
|
restrict: 'E',
|
|
require: '^ionSlideBox',
|
|
link: postLink
|
|
};
|
|
|
|
function postLink(scope, element, attr, slideBoxCtrl) {
|
|
var clickFn = attr.ngClick ?
|
|
$parse(attr.ngClick) :
|
|
function(scope, locals) {
|
|
slideBoxCtrl.select(locals.$slideIndex);
|
|
};
|
|
var node = element[0];
|
|
|
|
// Put it outside the slides container it was transcluded into
|
|
slideBoxCtrl.element.append(element);
|
|
|
|
element.addClass('slider-pager');
|
|
scope.slideBoxCtrl = slideBoxCtrl;
|
|
scope.pages = [];
|
|
|
|
element.on('click', onPagerClicked);
|
|
scope.$watch(slideBoxCtrl.count, watchCountAction);
|
|
scope.$watch(slideBoxCtrl.selected, watchSelectedAction);
|
|
|
|
function onPagerClicked(ev) {
|
|
for (var i = 0, pager; (pager = node.children[i]); i++) {
|
|
if (pager === ev.target) {
|
|
return doClick(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
function watchCountAction(count, oldCount) {
|
|
var i;
|
|
for (i = node.children.length; i < count; i++) {
|
|
addPager();
|
|
}
|
|
for (i = count; i < oldCount; i++) {
|
|
removePager(i);
|
|
}
|
|
}
|
|
|
|
function watchSelectedAction(selected, oldSelected) {
|
|
var old = node.children[oldSelected];
|
|
if (old) old.classList.remove('active');
|
|
var current = node.children[selected];
|
|
if (current) current.classList.add('active');
|
|
}
|
|
|
|
//* Extra methods *//
|
|
|
|
function doClick(index) {
|
|
scope.$apply(function() {
|
|
clickFn(scope, {
|
|
index: index, // DEPRECATED `index`
|
|
$slideIndex: index,
|
|
});
|
|
});
|
|
}
|
|
function addPager() {
|
|
var pager = document.createElement('div');
|
|
pager.className = 'slider-pager-page';
|
|
node.appendChild(pager);
|
|
}
|
|
function removePager(i) {
|
|
var pager = node.children[i];
|
|
pager && node.removeChild(pager);
|
|
}
|
|
}
|
|
|
|
}]);
|