diff --git a/src/carousel/carousel.js b/src/carousel/carousel.js
index 9d91004da7..ba65882d27 100644
--- a/src/carousel/carousel.js
+++ b/src/carousel/carousel.js
@@ -17,7 +17,7 @@ angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition'])
var destroyed = false;
/* direction: "prev" or "next" */
self.select = $scope.select = function(nextSlide, direction) {
- var nextIndex = slides.indexOf(nextSlide);
+ var nextIndex = self.indexOfSlide(nextSlide);
//Decide direction if it's not given
if (direction === undefined) {
direction = nextIndex > currentIndex ? 'next' : 'prev';
@@ -59,7 +59,7 @@ angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition'])
transitionDone(nextSlide, self.currentSlide);
}
self.currentSlide = nextSlide;
- currentIndex = nextIndex;
+ currentIndex = self.indexOfSlide(nextSlide);
//every time you change slides, reset the timer
restartTimer();
}
@@ -72,27 +72,55 @@ angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition'])
$scope.$on('$destroy', function () {
destroyed = true;
});
-
/* Allow outside people to call indexOf on slides array */
self.indexOfSlide = function(slide) {
- return slides.indexOf(slide);
+ if(angular.isUndefined(slide.$element)) {
+ return slides.indexOf(slide);
+ }
+ var slideElements = slide.$element.parent().children();
+ for(var i = 0; i < slideElements.length; i++){
+ if(slideElements[i] === slide.$element[0]){
+ return i;
+ }
+ }
+ return false;
};
- $scope.next = function() {
- var newIndex = (currentIndex + 1) % slides.length;
+ $scope.indexOfSlide = function (slide) {
+ return self.indexOfSlide(slide);
+ };
+ $scope.next = function() {
//Prevent this user-triggered transition from occurring if there is already one in progress
if (!$scope.$currentTransition) {
- return self.select(slides[newIndex], 'next');
+ var nextSlide = null;
+ if(angular.isUndefined(self.currentSlide.$element)) {
+ return false;
+ }
+ var nextElement = self.currentSlide.$element.next();
+ if(nextElement.length === 1){
+ nextSlide = getSlideFromDomElement(nextElement);
+ } else {
+ nextSlide = getFirstSlide();
+ }
+ return self.select(nextSlide, 'next');
}
};
$scope.prev = function() {
- var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1;
-
//Prevent this user-triggered transition from occurring if there is already one in progress
if (!$scope.$currentTransition) {
- return self.select(slides[newIndex], 'prev');
+ var prevSlide = null;
+ if(angular.isUndefined(self.currentSlide.$element)) {
+ return false;
+ }
+ var prevElement = self.currentSlide.$element[0].previousElementSibling;
+ if(prevElement !== null){
+ prevSlide = getSlideFromDomElement(prevElement);
+ } else {
+ prevSlide = getLastSlide();
+ }
+ return self.select(prevSlide, 'prev');
}
};
@@ -140,6 +168,33 @@ angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition'])
}
};
+ function getSlideFromDomElement(element) {
+ if(element.length){
+ element = element[0];
+ }
+ for (var i = slides.length - 1; i >= 0; i--) {
+ if(slides[i].$element[0] === element){
+ return slides[i];
+ }
+ }
+ return false;
+ }
+
+ function getSlideElements() {
+ return self.currentSlide.$element.parent().children();
+ }
+
+ function getLastSlide() {
+ var slideElements = getSlideElements();
+ var lastSlideElement = slideElements[slideElements.length-1];
+ return getSlideFromDomElement(lastSlideElement);
+ }
+
+ function getFirstSlide(){
+ var firstSlideElement = getSlideElements()[0];
+ return getSlideFromDomElement(firstSlideElement);
+ }
+
self.addSlide = function(slide, element) {
slide.$element = element;
slides.push(slide);
diff --git a/src/carousel/test/carousel.spec.js b/src/carousel/test/carousel.spec.js
index f8dac14457..f7e19646f0 100644
--- a/src/carousel/test/carousel.spec.js
+++ b/src/carousel/test/carousel.spec.js
@@ -266,7 +266,28 @@ describe('carousel', function() {
scope.$destroy();
expect($interval.cancel).toHaveBeenCalled();
});
-
+ it('should respect changes in order', function() {
+ scope.slides[0].order = 1;
+ scope.slides[1].order = 2;
+ scope.slides[2].order = 3;
+ var elm = $compile(
+ '