Przeglądaj źródła

Remove Region Views when region is destroyed.

Aleksander Nowodzinski 10 lat temu
rodzic
commit
76a0f46e88

+ 9 - 1
packages/ckeditor5-ui/src/ui/region.js

@@ -43,7 +43,15 @@ CKEDITOR.define( [ 'collection', 'model' ], function( Collection, Model ) {
 			this.views.on( 'remove', ( evt, view ) => view.el.remove() );
 		}
 
-		destroy() {}
+		destroy() {
+			// Drop the reference to HTMLElement.
+			this.el = null;
+
+			// Remove views.
+			for ( let i = this.views.length; i--; ) {
+				this.views.remove( i ).destroy();
+			}
+		}
 	}
 
 	return Region;

+ 25 - 0
packages/ckeditor5-ui/tests/ui/view/region.js

@@ -10,6 +10,8 @@
 
 var modules = bender.amd.require( 'ckeditor', 'ui/region', 'ui/view', 'collection' );
 
+bender.tools.createSinonSandbox();
+
 describe( 'Region', function() {
 	var region;
 	var el;
@@ -83,4 +85,27 @@ describe( 'Region', function() {
 		region.views.remove( tvb );
 		expect( childNodes.length ).to.be.equal( 0 );
 	} );
+
+	it( 'is destroyed properly', function() {
+		var View = modules[ 'ui/view' ];
+
+		class TestView extends View {
+			constructor() {
+				super();
+				this.template = { tag: 'a' };
+			}
+		}
+
+		var view = new TestView();
+		var spy = bender.sinon.spy( view, 'destroy' );
+
+		region.views.add( view );
+		expect( region.views ).to.have.length( 1 );
+
+		region.destroy();
+
+		expect( region.el ).to.be.null;
+		expect( region.views ).to.have.length( 0 );
+		expect( spy.calledOnce ).to.be.true;
+	} );
 } );