From 3ddaf34722054bde9c14c6f28f840fe10845a343 Mon Sep 17 00:00:00 2001 From: Adam Bradley Date: Sun, 30 Nov 2014 01:01:56 -0600 Subject: [PATCH] fix(collectionRepeat): rerender after resize/enter Previously on every `beforeEnter`, collection-repeats within a ion-nav-view would rerender. However, this is only necessary when the window resizes. The rerender already works when the collection-repeat is within the active view because the scroll view has accurate dimensions. But when the collection-repeat is within a cached view it does not have dimensions, causing the rerender to incorrectly place its items. This update will only rerender the collection-repeat if there was a window resize, and the scroll view which the collection-repeat was in, did not have dimensions at the time of the resize. If/when the view becomes the active view again, the collection-repeat will rerender on `afterEnter` when the scroll view has accurate dimensions. --- js/angular/directive/collectionRepeat.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/js/angular/directive/collectionRepeat.js b/js/angular/directive/collectionRepeat.js index e6180e8a6c..28a0ece7e0 100644 --- a/js/angular/directive/collectionRepeat.js +++ b/js/angular/directive/collectionRepeat.js @@ -247,15 +247,24 @@ function($collectionRepeatManager, $collectionDataSource, $parse) { dataSource.setData(value, beforeSiblings, afterSiblings); collectionRepeatManager.resize(); } + + var requiresRerender; function rerenderOnResize() { rerender(listExprParsed($scope)); + requiresRerender = (!scrollViewContent.clientWidth && !scrollViewContent.clientHeight); + } + + function viewEnter() { + if (requiresRerender) { + rerenderOnResize(); + } } scrollCtrl.$element.on('scroll.resize', rerenderOnResize); ionic.on('resize', rerenderOnResize, window); var deregisterViewListener; if (navViewCtrl) { - deregisterViewListener = navViewCtrl.scope.$on('$ionicView.beforeEnter', rerenderOnResize); + deregisterViewListener = navViewCtrl.scope.$on('$ionicView.afterEnter', viewEnter); } $scope.$on('$destroy', function() {