Skip to content

Commit b2585f1

Browse files
committed
fix(collectionRepeat): fix scroll when item bigger than viewport
Closes #1621
1 parent 96b2243 commit b2585f1

File tree

3 files changed

+20
-10
lines changed

3 files changed

+20
-10
lines changed

Diff for: js/angular/service/collectionRepeatManager.js

+11-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ function($rootScope, $timeout) {
1616

1717
this.isVertical = !!this.scrollView.options.scrollingY;
1818
this.renderedItems = {};
19-
19+
this.dimensions = [];
2020
this.setCurrentIndex(0);
2121

2222
//Override scrollview's render callback
@@ -142,19 +142,26 @@ function($rootScope, $timeout) {
142142
}
143143
},
144144
/*
145-
* setCurrentIndex: set the index in the list that matches the scroller's position.
145+
* setCurrentIndex sets the index in the list that matches the scroller's position.
146146
* Also save the position in the scroller for next and previous items (if they exist)
147147
*/
148148
setCurrentIndex: function(index, height) {
149+
var currentPos = (this.dimensions[index] || {}).primaryPos || 0;
149150
this.currentIndex = index;
150151

151152
this.hasPrevIndex = index > 0;
152153
if (this.hasPrevIndex) {
153-
this.previousPos = this.dimensions[index - 1].primaryPos;
154+
this.previousPos = Math.max(
155+
currentPos - this.dimensions[index - 1].primarySize,
156+
this.dimensions[index - 1].primaryPos
157+
);
154158
}
155159
this.hasNextIndex = index + 1 < this.dataSource.getLength();
156160
if (this.hasNextIndex) {
157-
this.nextPos = this.dimensions[index + 1].primaryPos;
161+
this.nextPos = Math.min(
162+
currentPos + this.dimensions[index + 1].primarySize,
163+
this.dimensions[index + 1].primaryPos
164+
);
158165
}
159166
},
160167
/**

Diff for: test/html/list-fit.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ <h1 class="title">Hi</h1>
2323
class="item-avatar-left item-icon-right"
2424
ng-click="alert(item)"
2525
collection-repeat="item in items"
26-
collection-item-height="85"
26+
collection-item-height="$index % 10 === 0 ? 500 : 85"
2727
collection-item-width="'100%'"
2828
style="position: absolute; left: 0; right: 0;">
2929
<img ng-src="{{item.image}}">
@@ -47,7 +47,7 @@ <h2>{{item.text}}</h2>
4747
ctx.drawImage(img,0,0);
4848
dataURL = canvas.toDataURL(outputFormat || 'image/png');
4949
callback.call(this, dataURL);
50-
canvas = null;
50+
canvas = null;
5151
};
5252
img.src = url;
5353
}
@@ -61,7 +61,7 @@ <h2>{{item.text}}</h2>
6161
for (var i = 0; i < 5; i++) {
6262
deferred = $q.defer();
6363
convertImgToBase64('http://placekitten.com/'+(40+(10*i))+'/'+(40+(10*i)), deferred.resolve);
64-
images.push(deferred.promise);
64+
images.push(deferred.promise);
6565
}
6666

6767
$q.all(images).then(function(dataUrls) {

Diff for: test/unit/angular/service/collectionRepeatManager.unit.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ describe('collectionRepeatManager service', function() {
284284
it('with next', function() {
285285
var manager = setup();
286286
spyOn(manager.dataSource, 'getLength').andReturn(2);
287-
manager.dimensions = [{ primaryPos: 0 }, { primaryPos: 25 }];
287+
manager.dimensions = [{ primaryPos: 0 ,primarySize: 25}, { primaryPos: 25, primarySize: 35 }];
288288
manager.setCurrentIndex(0);
289289
expect(manager.currentIndex).toBe(0);
290290
expect(manager.hasPrevIndex).toBe(false);
@@ -296,7 +296,7 @@ describe('collectionRepeatManager service', function() {
296296
it('with prev', function() {
297297
var manager = setup();
298298
spyOn(manager.dataSource, 'getLength').andReturn(2);
299-
manager.dimensions = [{ primaryPos: 0 }, { primaryPos: 25 }];
299+
manager.dimensions = [{ primaryPos: 0 , primarySize: 25 }, { primaryPos: 25, primarySize: 25 }];
300300
manager.setCurrentIndex(1);
301301
expect(manager.currentIndex).toBe(1);
302302
expect(manager.hasPrevIndex).toBe(true);
@@ -308,7 +308,7 @@ describe('collectionRepeatManager service', function() {
308308
it('with next and prev', function() {
309309
var manager = setup();
310310
spyOn(manager.dataSource, 'getLength').andReturn(3);
311-
manager.dimensions = [{ primaryPos: 0 }, { primaryPos: 25 }, { primaryPos: 50 }];
311+
manager.dimensions = [{ primarySize: 25, primaryPos: 0 }, { primarySize: 25, primaryPos: 25 }, { primarySize: 25, primaryPos: 50 }];
312312
manager.setCurrentIndex(1);
313313
expect(manager.currentIndex).toBe(1);
314314
expect(manager.hasPrevIndex).toBe(true);
@@ -378,13 +378,16 @@ describe('collectionRepeatManager service', function() {
378378
var manager = setup();
379379
manager.renderedItems = {'a':1, 'b':1};
380380
spyOn(manager, 'removeItem');
381+
spyOn(manager.dataSource, 'getLength').andReturn(0);
382+
manager.currentIndex = 1;
381383
manager.render();
382384
expect(manager.removeItem).toHaveBeenCalledWith('a');
383385
expect(manager.removeItem).toHaveBeenCalledWith('b');
384386
});
385387
it('shouldRedrawAll should remove all', function() {
386388
var manager = setup();
387389
manager.renderedItems = {'a':1, 'b':1};
390+
manager.currentIndex = 0;
388391
spyOn(manager, 'removeItem');
389392
manager.render(true);
390393
expect(manager.removeItem).toHaveBeenCalledWith('a');

0 commit comments

Comments
 (0)