Skip to content

Commit d9cc789

Browse files
committed
enhance(slideBox): re-add update() method
1 parent 01c829c commit d9cc789

File tree

6 files changed

+41
-36
lines changed

6 files changed

+41
-36
lines changed

js/angular/controller/slideBoxController.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ function(scope, element, $$ionicAttachDrag, $interval) {
3636
self.loop = slideList.loop;
3737
self.delta = slideList.delta;
3838

39+
self.update = update;
3940
self.enableSlide = enableSlide;
4041
self.autoPlay = autoPlay;
4142
self.add = add;
@@ -73,6 +74,18 @@ function(scope, element, $$ionicAttachDrag, $interval) {
7374
return slideList.next(index);
7475
}
7576

77+
function update() {
78+
var selectedIndex = scope.selectedIndex;
79+
for (var i = self.count() - 1; i >= 0; i--) {
80+
slideList.remove(i);
81+
}
82+
var slideNodes = element[0].querySelectorAll('ion-slide');
83+
for (var j = 0, jj = slideNodes.length; j < jj; j++) {
84+
slideList.add(jqLite(slideNodes[j]).controller('ionSlide'));
85+
}
86+
self.select(selectedIndex);
87+
}
88+
7689
function enableSlide(isEnabled) {
7790
if (arguments.length) {
7891
self.dragDisabled = !isEnabled;
@@ -95,7 +108,7 @@ function(scope, element, $$ionicAttachDrag, $interval) {
95108
*/
96109
function add(slide, index) {
97110
var newIndex = slideList.add(slide, index);
98-
slide.onAdded(slidesParent);
111+
slide.onAdded();
99112

100113
// If we are waiting for a certain scope.selectedIndex and this is it,
101114
// select the slide
@@ -126,12 +139,12 @@ function(scope, element, $$ionicAttachDrag, $interval) {
126139
if (index === -1) return;
127140

128141
// If the slide is current, next, or previous, save so we can re-select after moving.
129-
var isRelevant = self.isRelevant(targetIndex);
142+
var isRelevant = self.selected() === index || self.isRelevant(targetIndex);
130143
slideList.remove(index);
131144
slideList.add(slide, targetIndex);
132145

133146
if (isRelevant) {
134-
enqueueRefresh();
147+
self.select(targetIndex);
135148
}
136149
}
137150

js/angular/controller/slideController.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,7 @@ function(scope, element, $q) {
2626
// Public Methods
2727
// ***
2828

29-
function onAdded(parentElement) {
30-
self.parentElement = parentElement;
31-
29+
function onAdded() {
3230
// Set default state
3331
self.setState('detached');
3432
}
@@ -85,19 +83,21 @@ function(scope, element, $q) {
8583
// ***
8684

8785
function attachSlide() {
88-
if (!self.element[0].parentNode) {
89-
self.parentElement.append(self.element);
90-
ionic.Utils.reconnectScope(scope);
91-
}
86+
// if (!self.element[0].parentNode) {
87+
// self.parentElement.append(self.element);
88+
// ionic.Utils.reconnectScope(scope);
89+
// }
90+
ionic.Utils.reconnectScope(scope);
9291
}
9392

9493
function detachSlide() {
9594
// Don't use self.element.remove(), that will destroy the element's data
96-
var parent = self.element[0].parentNode;
97-
if (parent) {
98-
parent.removeChild(self.element[0]);
99-
ionic.Utils.disconnectScope(scope);
100-
}
95+
// var parent = self.element[0].parentNode;
96+
// if (parent) {
97+
// parent.removeChild(self.element[0]);
98+
// ionic.Utils.disconnectScope(scope);
99+
// }
100+
ionic.Utils.disconnectScope(scope);
101101
}
102102

103103
var transitionDeferred;

js/angular/directive/slide.js

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,6 @@ IonicModule
3838
slideBoxCtrl.remove(slideCtrl);
3939
});
4040

41-
element.one('$animate:after', watchNgRepeatIndexOnInsertElement);
42-
element.on('$animate:after', refreshStateOnInsertElement);
43-
44-
// If this element is inserted later by an ng-if or ng-repeat, remove it
45-
// from the DOM again if it's irrelevant (not selected or adjacent).
46-
function refreshStateOnInsertElement() {
47-
var slideIndex = slideBoxCtrl.indexOf(slideCtrl);
48-
if (!slideBoxCtrl.isRelevant(slideIndex)) {
49-
slideCtrl.setState('detached');
50-
}
51-
}
52-
5341
// Move with ng-repeat if this slide is part of ng-repeat.
5442
// scope.$index only appears after the first time ng-repaet inserts the element.
5543
function watchNgRepeatIndexOnInsertElement() {

js/angular/service/slideBoxDelegate.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,16 @@ IonicModule
8888
* @name $ionicSlideBoxDelegate#count
8989
* @returns `number` The number of slides there are currently.
9090
*/
91-
'count'
91+
'count',
92+
/**
93+
* @ngdoc method
94+
* @name $ionicSlideBoxDelegate#update
95+
* @description Causes the slidebox to re-scan all of the child slide
96+
* elements and reorganize itself again.
97+
* You only need to call update if you are moving slides around in the DOM
98+
* (for example, ng-repeat moving an element from the middle to the end).
99+
*/
100+
'update',
92101
/**
93102
* @ngdoc method
94103
* @name $ionicSlideBoxDelegate#$getByHandle

test/html/slideBox.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
}
4242
</style>
4343
</head>
44-
<body ng-init="$root.selectedIndex = 3">
44+
<body ng-init="$root.selectedIndex = 0">
4545

4646
<div ng-controller="SlideCtrl" ng-init="$root.hasBox = true">
4747
<ion-content>
@@ -94,7 +94,7 @@ <h3>item {{i}}</h3>
9494

9595
.controller('SlideCtrl', function($scope, $timeout) {
9696
$scope.items = [];
97-
for (var i = 0; i < 50; i++) {
97+
for (var i = 0; i < 1000; i++) {
9898
$scope.items.push(i);
9999
}
100100

test/unit/angular/controller/slideController.unit.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,28 +28,23 @@ describe('$ionSlide controller', function() {
2828

2929
it('#setState()', function() {
3030
var ctrl = makeCtrl();
31-
ctrl.onAdded(angular.element('<div>'));
31+
ctrl.onAdded();
3232

33-
expect(ctrl.element.parent().length).toBe(0);
3433
ctrl.setState('selected');
3534
expect(ctrl.element.attr('slide-state')).toBe('selected');
3635
expect(ctrl.element.attr('slide-previous-state')).toBe('detached');
37-
expect(ctrl.element.parent()[0]).toBe(ctrl.parentElement[0]);
3836

3937
ctrl.setState('previous');
4038
expect(ctrl.element.attr('slide-state')).toBe('previous');
4139
expect(ctrl.element.attr('slide-previous-state')).toBe('selected');
42-
expect(ctrl.element.parent()[0]).toBe(ctrl.parentElement[0]);
4340

4441
ctrl.setState('detached');
4542
expect(ctrl.element.attr('slide-state')).toBe('detached');
4643
expect(ctrl.element.attr('slide-previous-state')).toBe('previous');
47-
expect(ctrl.element.parent().length).toBe(0);
4844

4945
ctrl.setState('next');
5046
expect(ctrl.element.attr('slide-state')).toBe('next');
5147
expect(ctrl.element.attr('slide-previous-state')).toBe('detached');
52-
expect(ctrl.element.parent()[0]).toBe(ctrl.parentElement[0]);
5348

5449
});
5550
});

0 commit comments

Comments
 (0)