8
0
Просмотр исходного кода

Renderer's _updateChildren unbinds unused DOM nodes after all actions are performed.

Szymon Kupś 8 лет назад
Родитель
Сommit
817023490f
1 измененных файлов с 8 добавлено и 9 удалено
  1. 8 9
      packages/ckeditor5-engine/src/view/renderer.js

+ 8 - 9
packages/ckeditor5-engine/src/view/renderer.js

@@ -445,9 +445,7 @@ export default class Renderer {
 		}
 
 		const domDocument = domElement.ownerDocument;
-
 		const filler = options.inlineFillerPosition;
-
 		const actualDomChildren = domElement.childNodes;
 		const expectedDomChildren = Array.from( domConverter.viewChildrenToDom( viewElement, domDocument, { bind: true } ) );
 
@@ -468,22 +466,23 @@ export default class Renderer {
 
 		for ( const action of actions ) {
 			if ( action === 'insert' ) {
-				// this.domConverter.bindElements( expectedDomChildren[ i ],  );
 				insertAt( domElement, i, expectedDomChildren[ i ] );
-				// TODO: bind element it might be unbind when deleting before.
 				i++;
 			} else if ( action === 'delete' ) {
-				// Whenever element is removed from DOM, unbind it and all of its children.
-				this.domConverter.unbindDomElement( actualDomChildren[ i ] );
-				// nodesToUnbind.add( actualDomChildren[ i ] );
-
+				nodesToUnbind.add( actualDomChildren[ i ] );
 				remove( actualDomChildren[ i ] );
 			} else { // 'equal'
 				i++;
 			}
 		}
 
-
+		// Unbind removed nodes. We don't need to check child nodes, because if child node was reinserted, it was moved
+		// to DOM tree out of the removed node.
+		for ( const node of nodesToUnbind ) {
+			if ( !node.parentNode ) {
+				this.domConverter.unbindDomElement( node );
+			}
+		}
 
 		function sameNodes( actualDomChild, expectedDomChild ) {
 			// Elements.