feat($ionicScrollDelegate): add .anchorScroll() function

Scrolls to the location of element with id matching $location.hash(). If
$location.hash() is blank or the id does not exist, it will scroll to
the top.
This commit is contained in:
Andy Joslin
2014-02-09 11:37:30 -05:00
parent a970f0bdc3
commit c2bbd9e96e
2 changed files with 103 additions and 10 deletions

View File

@@ -55,7 +55,7 @@ describe('Ionic ScrollDelegate Service', function() {
expect(sv.getValues().top).toBe(0);
});
it('Should resize & scroll top', function() {
it('Should resize & scroll bottom', function() {
var scope = rootScope.$new();
var el = compile('<content start-y="100"></content>')(scope);
@@ -83,3 +83,76 @@ describe('Ionic ScrollDelegate Service', function() {
});
});
describe('anchorScroll', function() {
function setLocationHash(hash) {
inject(function($location) {
$location.hash = function() { return hash; };
});
}
beforeEach(module('ionic'));
var contentEl, scope, del;
beforeEach(inject(function($rootScope, $compile, $timeout, $document, $ionicScrollDelegate) {
scope = $rootScope.$new();
contentEl = $compile('<content></content>')(scope);
mockBody = angular.element('<div>').append(contentEl);
$document.body = mockBody[0];
del = $ionicScrollDelegate
}));
it('should anchorScroll to an element with id', function() {
var anchorMe = angular.element('<div id="anchorMe">');
var sv = del.getScrollView(scope);
spyOn(sv, 'scrollTo');
setLocationHash('anchorMe');
contentEl.append(anchorMe);
var pos = ionic.DomUtil.getPositionInParent(anchorMe[0], contentEl[0]);
del.anchorScroll();
expect(sv.scrollTo).toHaveBeenCalledWith(pos.left, pos.top);
});
it('should anchorScroll to top if !$location.hash()', function() {
var sv = del.getScrollView(scope);
spyOn(sv, 'scrollTo');
del.anchorScroll();
expect(sv.scrollTo).toHaveBeenCalledWith(0, 0);
});
it('should anchorScroll to top if element with hash id doesnt exist', function() {
var sv = del.getScrollView(scope);
spyOn(sv, 'scrollTo');
setLocationHash('doesnotexist');
del.anchorScroll();
expect(sv.scrollTo).toHaveBeenCalledWith(0, 0);
});
it('should anchorScroll to first element with id if multiple exist', function() {
var foo1 = angular.element('<div id="foo">hello</div>');
var foo2 = angular.element('<div id="foo">hola</div>');
var sv = del.getScrollView(scope);
contentEl.append(foo1).append(foo2);
//Fake the top/left because dom doesn't have time to load in a test
spyOn(ionic.DomUtil, 'getPositionInParent').andCallFake(function(el) {
return el === foo1[0] ? {left: 20, top: 40} : {left: 30, top: 50};
});
var pos1 = ionic.DomUtil.getPositionInParent(foo1[0], contentEl[0]);
var pos2 = ionic.DomUtil.getPositionInParent(foo2[0], contentEl[0]);
spyOn(sv, 'scrollTo');
setLocationHash('foo');
del.anchorScroll();
expect(sv.scrollTo.callCount).toBe(1);
expect(sv.scrollTo).toHaveBeenCalledWith(pos1.left, pos1.top);
expect(sv.scrollTo).not.toHaveBeenCalledWith(pos2.left, pos2.top);
});
});