feat(collectionRepeat): other children of ion-content element fit in

Closes #1920. Closes #1866. Closes #1380.
This commit is contained in:
Andrew
2014-08-06 10:31:17 -06:00
parent c0b6426625
commit 7ddb57e60b
12 changed files with 220 additions and 147 deletions

View File

@@ -106,16 +106,16 @@ describe('collectionRepeat directive', function() {
it('should error if list is not an array and is truthy', function() {
var el = setup('collection-repeat="item in items" collection-item-height="50"');
expect(function() {
expect(function() {
el.scope().$apply('items = "string"');
}).toThrow();
expect(function() {
expect(function() {
el.scope().$apply('items = 123');
}).toThrow();
expect(function() {
expect(function() {
el.scope().$apply('items = {}');
}).toThrow();
expect(function() {
expect(function() {
el.scope().$apply('items = []');
}).not.toThrow();
});
@@ -128,11 +128,11 @@ describe('collectionRepeat directive', function() {
repeatManager.resize.reset();
el.scope().$apply('items = [ 1,2,3 ]');
expect(dataSource.setData).toHaveBeenCalledWith(el.scope().items);
expect(dataSource.setData).toHaveBeenCalledWith(el.scope().items, [], []);
expect(repeatManager.resize.callCount).toBe(1);
expect(scrollView.resize.callCount).toBe(1);
el.scope().$apply('items = null');
expect(dataSource.setData).toHaveBeenCalledWith(null);
expect(dataSource.setData).toHaveBeenCalledWith(null, [], []);
expect(repeatManager.resize.callCount).toBe(2);
expect(scrollView.resize.callCount).toBe(2);
});
@@ -147,7 +147,7 @@ describe('collectionRepeat directive', function() {
el.scope().items = [1,2,3];
ionic.trigger('resize', { target: window });
expect(dataSource.setData).toHaveBeenCalledWith(el.scope().items);
expect(dataSource.setData).toHaveBeenCalledWith(el.scope().items, [], []);
expect(repeatManager.resize.callCount).toBe(1);
expect(scrollView.resize.callCount).toBe(1);
});

View File

@@ -98,11 +98,11 @@ describe('ionicInfiniteScroll directive', function() {
].forEach(function(opts) {
describe('with scrollingX='+opts.scrollingX+', scrollingY='+opts.scrollingY, function() {
it('should default to 1%', function() {
it('should default to 2.5%', function() {
var el = setup('', {}, opts);
expect(ctrl.getMaxScroll()).toEqual({
left: opts.scrollingX ? scrollLeftMaxValue * 0.99 : -1,
top: opts.scrollingY ? scrollTopMaxValue * 0.99 : -1
left: opts.scrollingX ? scrollLeftMaxValue * 0.975 : -1,
top: opts.scrollingY ? scrollTopMaxValue * 0.975 : -1
});
});

View File

@@ -21,6 +21,9 @@ describe('$collectionDataSource service', function() {
cb( $compile(template || '<div>')(scope) );
};
dataSource = new $collectionDataSource(options);
dataSource.dataStartIndex = 0;
dataSource.beforeSiblings = [];
dataSource.afterSiblings = [];
});
return dataSource;
}
@@ -148,6 +151,7 @@ describe('$collectionDataSource service', function() {
keyExpr: 'value'
});
source.data = ['a', 'b', 'c'];
source.dimensions = ['a','b','c'];
spyOn(source, 'getItem').andCallFake(function() {
return { scope: $rootScope.$new() };
});
@@ -242,15 +246,15 @@ describe('$collectionDataSource service', function() {
describe('.getLength()', function() {
it('should return 0 by default', function() {
var source = setup();
source.data = null;
source.dimensions = null;
expect(source.getLength()).toBe(0);
});
it('should return data length', function() {
it('should return dimensions length', function() {
var source = setup();
source.data = [1,2,3];
source.dimensions = [1,2,3];
expect(source.getLength()).toBe(3);
source.data = [];
source.dimensions = [];
expect(source.getLength()).toBe(0);
});
});

View File

@@ -180,7 +180,7 @@ describe('collectionRepeatManager service', function() {
manager.secondaryScrollSize = function() {
return 100;
};
var result = manager.calculateDimensions();
var result = manager.calculateDimensions().dimensions;
expect(result[0].primarySize).toBe(20);
expect(result[0].secondarySize).toBe(100);
expect(result[0].primaryPos).toBe(0);
@@ -214,7 +214,7 @@ describe('collectionRepeatManager service', function() {
manager.secondaryScrollSize = function() {
return 90;
};
var result = manager.calculateDimensions();
var result = manager.calculateDimensions().dimensions;
expect(result[0].primarySize).toBe(30);
expect(result[0].secondarySize).toBe(30);
expect(result[0].primaryPos).toBe(0);
@@ -251,7 +251,11 @@ describe('collectionRepeatManager service', function() {
it('should work without data', function() {
var manager = setup();
spyOn(manager, 'render');
spyOn(manager, 'calculateDimensions').andReturn([]);
spyOn(manager, 'calculateDimensions').andReturn({
dimensions: [],
beforeSize: 0,
totalSize: 0
});
spyOn(manager, 'setCurrentIndex');
manager.resize();
expect(manager.dimensions).toEqual([]);
@@ -261,9 +265,13 @@ describe('collectionRepeatManager service', function() {
});
it('should work with data', function() {
var manager = setup();
spyOn(manager, 'calculateDimensions').andReturn([{
primaryPos: 100, primarySize: 30
}]);
spyOn(manager, 'calculateDimensions').andReturn({
dimensions: [{
primaryPos: 100, primarySize: 30
}],
beforeSize: 0,
totalSize: 130
});
manager.resize();
expect(manager.viewportSize).toBe(130);
});
@@ -430,12 +438,12 @@ describe('collectionRepeatManager service', function() {
});
manager.resize(); //triggers render
//it should render (items that fit * items per row) with one extra row at end
expect(Object.keys(manager.renderedItems).length).toBe(18);
for (var i = 0; i < 18; i++) {
//it should render (items that fit * items per row) with three extra row at end
expect(Object.keys(manager.renderedItems).length).toBe(20);
for (var i = 0; i < 20; i++) {
expect(manager.renderedItems[i]).toBe(true);
}
expect(manager.renderedItems[18]).toBeUndefined();
expect(manager.renderedItems[20]).toBeUndefined();
});
it('should render items in the middle of the screen', function() {
@@ -449,32 +457,15 @@ describe('collectionRepeatManager service', function() {
manager.resize();
var startIndex = 17;
var bufferStartIndex = 14; //one row of buffer before the start
var bufferEndIndex = 35; //start + 17 + 6
var bufferEndIndex = 37; //start + 17 + 6
expect(Object.keys(manager.renderedItems).length).toBe(22);
expect(Object.keys(manager.renderedItems).length).toBe(24);
for (var i = bufferStartIndex; i <= bufferEndIndex; i++) {
expect(manager.renderedItems[i]).toBe(true);
}
expect(manager.renderedItems[bufferStartIndex - 1]).toBeUndefined();
expect(manager.renderedItems[bufferEndIndex + 1]).toBeUndefined();
});
it('should remove items outside the range', function() {
var manager = mockRendering({
itemWidth: 3,
itemHeight: 20,
scrollWidth: 10,
scrollHeight: 100
});
manager.resize();
manager.removeItem.reset();
manager.renderedItems = { 17: true, 18: true, 19: true };
//resize() re-renders everything, need to just do a normal rerender
manager.render();
expect(manager.removeItem.callCount).toBe(2);
expect(manager.removeItem).toHaveBeenCalledWith('18');
expect(manager.removeItem).toHaveBeenCalledWith('19');
});
});
describe('.renderItem()', function() {