@@ -372,16 +372,19 @@ export class GridStack {
372372 **/
373373 public load ( layout : GridStackWidget [ ] , addAndRemove : boolean | ( ( w : GridStackWidget , add : boolean ) => void ) = true ) {
374374 let items = GridStack . Utils . sort ( layout ) ;
375+ let removed : GridStackNode [ ] = [ ] ;
375376 this . batchUpdate ( ) ;
376377 // see if any items are missing from new layout and need to be removed first
377378 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 => {
379381 let item = items . find ( w => n . id === w . id ) ;
380382 if ( ! item ) {
381383 if ( typeof ( addAndRemove ) === 'function' ) {
382384 addAndRemove ( n , false ) ;
383385 } else {
384- this . removeWidget ( n . el ) ;
386+ removed . push ( n ) ; // batch keep track
387+ this . removeWidget ( n . el , true , false ) ;
385388 }
386389 }
387390 } ) ;
@@ -399,6 +402,7 @@ export class GridStack {
399402 }
400403 }
401404 } ) ;
405+ this . engine . removedNodes = removed ;
402406 this . commit ( ) ;
403407 }
404408
@@ -892,7 +896,7 @@ export class GridStack {
892896 * @param el widget or selector to modify
893897 * @param removeDOM if `false` DOM element won't be removed from the tree (Default? true).
894898 */
895- public removeWidget ( els : GridStackElement , removeDOM = true ) : GridStack {
899+ public removeWidget ( els : GridStackElement , removeDOM = true , triggerEvent = true ) : GridStack {
896900 this . getElements ( els ) . forEach ( el => {
897901 if ( el . parentElement !== this . el ) return ; // not our child!
898902 let node = el . gridstackNode ;
@@ -906,10 +910,16 @@ export class GridStack {
906910 delete el . gridstackNode ;
907911 this . dd . draggable ( el , 'destroy' ) . resizable ( el , 'destroy' ) ;
908912
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+ }
910918 } ) ;
911- this . _triggerRemoveEvent ( ) ;
912- this . _triggerChangeEvent ( ) ;
919+ if ( triggerEvent ) {
920+ this . _triggerRemoveEvent ( ) ;
921+ this . _triggerChangeEvent ( ) ;
922+ }
913923 return this ;
914924 }
915925
0 commit comments