@@ -372,16 +372,19 @@ export class GridStack {
372
372
**/
373
373
public load ( layout : GridStackWidget [ ] , addAndRemove : boolean | ( ( w : GridStackWidget , add : boolean ) => void ) = true ) {
374
374
let items = GridStack . Utils . sort ( layout ) ;
375
+ let removed : GridStackNode [ ] = [ ] ;
375
376
this . batchUpdate ( ) ;
376
377
// see if any items are missing from new layout and need to be removed first
377
378
if ( addAndRemove ) {
378
- this . engine . nodes . forEach ( n => {
379
+ let copyNodes = [ ...this . engine . nodes ] ; // don't loop through array you modify
380
+ copyNodes . forEach ( n => {
379
381
let item = items . find ( w => n . id === w . id ) ;
380
382
if ( ! item ) {
381
383
if ( typeof ( addAndRemove ) === 'function' ) {
382
384
addAndRemove ( n , false ) ;
383
385
} else {
384
- this . removeWidget ( n . el ) ;
386
+ removed . push ( n ) ; // batch keep track
387
+ this . removeWidget ( n . el , true , false ) ;
385
388
}
386
389
}
387
390
} ) ;
@@ -399,6 +402,7 @@ export class GridStack {
399
402
}
400
403
}
401
404
} ) ;
405
+ this . engine . removedNodes = removed ;
402
406
this . commit ( ) ;
403
407
}
404
408
@@ -892,7 +896,7 @@ export class GridStack {
892
896
* @param el widget or selector to modify
893
897
* @param removeDOM if `false` DOM element won't be removed from the tree (Default? true).
894
898
*/
895
- public removeWidget ( els : GridStackElement , removeDOM = true ) : GridStack {
899
+ public removeWidget ( els : GridStackElement , removeDOM = true , triggerEvent = true ) : GridStack {
896
900
this . getElements ( els ) . forEach ( el => {
897
901
if ( el . parentElement !== this . el ) return ; // not our child!
898
902
let node = el . gridstackNode ;
@@ -906,10 +910,16 @@ export class GridStack {
906
910
delete el . gridstackNode ;
907
911
this . dd . draggable ( el , 'destroy' ) . resizable ( el , 'destroy' ) ;
908
912
909
- this . engine . removeNode ( node , removeDOM , true ) ; // true for trigger event
913
+ this . engine . removeNode ( node , removeDOM , triggerEvent ) ;
914
+
915
+ if ( removeDOM && el . parentElement ) {
916
+ el . remove ( ) ; // in batch mode engine.removeNode doesn't call back to remove DOM
917
+ }
910
918
} ) ;
911
- this . _triggerRemoveEvent ( ) ;
912
- this . _triggerChangeEvent ( ) ;
919
+ if ( triggerEvent ) {
920
+ this . _triggerRemoveEvent ( ) ;
921
+ this . _triggerChangeEvent ( ) ;
922
+ }
913
923
return this ;
914
924
}
915
925
0 commit comments