Skip to content

Commit 954beba

Browse files
jedanconamportuga
jedancona
authored andcommitted
fix(enableColumnResizing): enableColumnResizing accumulates watchers with each table $digest cycle (#5933)
* Fix for column resizer watchers accumulating. * Added declarations for resizerScopes and resizers array. * Added unit test to ensure watchers get destroyed.
1 parent e23a2af commit 954beba

File tree

2 files changed

+34
-12
lines changed

2 files changed

+34
-12
lines changed

src/features/resize-columns/js/ui-grid-column-resizer.js

+24-12
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,9 @@
199199
compile: function() {
200200
return {
201201
post: function ($scope, $elm, $attrs, uiGridCtrl) {
202-
var grid = uiGridCtrl.grid;
202+
var grid = uiGridCtrl.grid,
203+
resizerScopes = [],
204+
resizers = [];
203205

204206
if (grid.options.enableColumnResizing) {
205207
var columnResizerElm = $templateCache.get('ui-grid/columnResizer');
@@ -211,13 +213,9 @@
211213
rtlMultiplier = -1;
212214
}
213215

214-
var displayResizers = function(){
216+
var displayResizers = function () {
215217

216-
// remove any existing resizers.
217-
var resizers = $elm[0].getElementsByClassName('ui-grid-column-resizer');
218-
for ( var i = 0; i < resizers.length; i++ ){
219-
angular.element(resizers[i]).remove();
220-
}
218+
removeResizers();
221219

222220
// get the target column for the left resizer
223221
var otherCol = uiGridResizeColumnsService.findTargetCol($scope.col, 'left', rtlMultiplier);
@@ -227,18 +225,29 @@
227225
if (otherCol && renderContainer.visibleColumnCache.indexOf($scope.col) !== 0 && otherCol.colDef.enableColumnResizing !== false) {
228226
var resizerLeft = angular.element(columnResizerElm).clone();
229227
resizerLeft.attr('position', 'left');
230-
231228
$elm.prepend(resizerLeft);
232-
$compile(resizerLeft)($scope);
229+
$compile(resizerLeft)(resizerScopes[resizerScopes.push($scope.$new()) - 1]);
233230
}
234231

235232
// Don't append the right resizer if this column has resizing disabled
236233
if ($scope.col.colDef.enableColumnResizing !== false) {
237234
var resizerRight = angular.element(columnResizerElm).clone();
238235
resizerRight.attr('position', 'right');
239-
240236
$elm.append(resizerRight);
241-
$compile(resizerRight)($scope);
237+
$compile(resizerRight)(resizerScopes[resizerScopes.push($scope.$new()) - 1]);
238+
}
239+
};
240+
241+
var removeResizers = function() {
242+
// remove any existing resizer scopes.
243+
for (var x = resizerScopes.length - 1; x >= 0; x--) {
244+
resizerScopes[x].$destroy();
245+
resizerScopes.splice(x);
246+
}
247+
// remove any existing resizer elements.
248+
resizers = $elm[0].getElementsByClassName('ui-grid-column-resizer');
249+
for (var i = resizers.length - 1; i >= 0; i--) {
250+
angular.element(resizers[i]).remove();
242251
}
243252
};
244253

@@ -250,7 +259,10 @@
250259

251260
var dataChangeDereg = grid.registerDataChangeCallback( waitDisplay, [uiGridConstants.dataChange.COLUMN] );
252261

253-
$scope.$on( '$destroy', dataChangeDereg );
262+
$scope.$on( '$destroy',function() {
263+
dataChangeDereg();
264+
removeResizers();
265+
});
254266
}
255267
}
256268
};

src/features/resize-columns/test/resizeColumns.spec.js

+10
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ describe('ui.grid.resizeColumns', function () {
9393
});
9494
});
9595

96+
describe('destroying header cell',function(){
97+
it('should have 0 watchers after destroy',function(){
98+
var secondCol = $(grid).find('[ui-grid-header-cell]:nth-child(1)');
99+
secondCol.parent().scope().$destroy();
100+
var numWatchers = secondCol.scope().$$watchers.length;
101+
102+
expect(numWatchers).toEqual(0);
103+
});
104+
});
105+
96106
describe('setting enableColumnResizing to false', function () {
97107
it('should result in no resizer elements being attached to the column', function () {
98108
$scope.gridOpts.enableColumnResizing = false;

0 commit comments

Comments
 (0)