diff --git a/js/angular/directive/collectionRepeat.js b/js/angular/directive/collectionRepeat.js index 3b5993e67a..febab84c08 100644 --- a/js/angular/directive/collectionRepeat.js +++ b/js/angular/directive/collectionRepeat.js @@ -406,6 +406,21 @@ function RepeatManagerFactory($rootScope, $window, $$rAF) { (isGridView ? GridViewType : ListViewType).call(view); (isStaticView ? StaticViewType : DynamicViewType).call(view); + var contentSizeStr = isVertical ? 'getContentHeight' : 'getContentWidth'; + var originalGetContentSize = scrollView.options[contentSizeStr]; + scrollView.options[contentSizeStr] = angular.bind(view, view.getContentSize); + + scrollView.__$callback = scrollView.__callback; + scrollView.__callback = function(transformLeft, transformTop, zoom, wasResize) { + var scrollValue = view.getScrollValue(); + if (renderStartIndex === -1 || + scrollValue + view.scrollPrimarySize > renderAfterBoundary || + scrollValue < renderBeforeBoundary) { + render(); + } + scrollView.__$callback(transformLeft, transformTop, zoom, wasResize); + }; + var isLayoutReady = false; var isDataReady = false; this.refreshLayout = function(itemsAfterRepeater) { @@ -448,6 +463,8 @@ function RepeatManagerFactory($rootScope, $window, $$rAF) { } }; + + this.refreshData = function(newData) { newData || (newData = []); @@ -471,7 +488,6 @@ function RepeatManagerFactory($rootScope, $window, $$rAF) { render.destroyed = true; unwatch(); - scrollView.__calback = scrollView.__$callback; itemsPool.forEach(function(item) { item.scope.$destroy(); item.scope = item.element = item.node = item.images = null; @@ -479,24 +495,14 @@ function RepeatManagerFactory($rootScope, $window, $$rAF) { itemsPool.length = itemsEntering.length = itemsLeaving.length = 0; itemsShownMap = {}; + //Restore the scrollView's normal behavior and resize it to normal size. + scrollView.options[contentSizeStr] = originalGetContentSize; + scrollView.__callback = scrollView.__$callback; + scrollView.resize(); + (view.onDestroy || angular.noop)(); }; - scrollView.options[isVertical ? 'getContentHeight' : 'getContentWidth'] = - angular.bind(view, view.getContentSize); - - scrollView.__$callback = scrollView.__callback; - scrollView.__callback = function(transformLeft, transformTop, zoom, wasResize) { - var scrollValue = view.getScrollValue(); - if (renderStartIndex === -1 || - scrollValue + view.scrollPrimarySize > renderAfterBoundary || - scrollValue < renderBeforeBoundary) { - render(); - } - scrollView.__$callback(transformLeft, transformTop, zoom, wasResize); - }; - - function forceRerender() { return render(true); } diff --git a/test/unit/angular/directive/collectionRepeat.unit.js b/test/unit/angular/directive/collectionRepeat.unit.js index 7c89d42aea..051431bbc0 100644 --- a/test/unit/angular/directive/collectionRepeat.unit.js +++ b/test/unit/angular/directive/collectionRepeat.unit.js @@ -156,14 +156,30 @@ describe('collectionRepeat', function() { }).toThrow(); })); - it('should destroy', inject(function($compile, $rootScope) { + it('should destroy and restore normal scrollView behavior', inject(function($compile, $rootScope) { var scope = $rootScope.$new(); - var content = $compile('' + - '
' + - '
')(scope); + var content = $compile('')(scope); + var scrollView = content.data('$$ionicScrollController').scrollView; + + var originalCallback = scrollView.__callback; + var originalGetContentHeight = scrollView.options.getContentHeight; + + var repeater = angular.element( + '
' + ); + content.append(repeater); + $compile(repeater)(content.scope()); $rootScope.$apply(); content.triggerHandler('scroll.init'); + $rootScope.$apply(); + + expect(scrollView.__callback).not.toBe(originalCallback); + expect(scrollView.options.getContentHeight).not.toBe(originalGetContentHeight); + scope.$destroy(); + + expect(scrollView.__callback).toBe(originalCallback); + expect(scrollView.options.getContentHeight).toBe(originalGetContentHeight); })); describe('automatic dimensions', function() {