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.
This commit is contained in:
Adam Bradley
2014-11-30 01:01:56 -06:00
parent 3e31614fb4
commit 3ddaf34722

View File

@@ -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() {