@@ -127,14 +127,36 @@ class VirtualListElement extends ElementMixin(ThemableMixin(PolymerElement)) {
127
127
128
128
/** @private */
129
129
__updateElement ( el , index ) {
130
+ if ( el . __renderer !== this . renderer ) {
131
+ el . __renderer = this . renderer ;
132
+ this . __clearRenderTargetContent ( el ) ;
133
+ }
134
+
130
135
if ( this . renderer ) {
131
136
this . renderer ( el , this , { item : this . items [ index ] , index } ) ;
132
137
}
133
138
}
134
139
140
+ /**
141
+ * Clears the content of a render target.
142
+ * @private
143
+ */
144
+ __clearRenderTargetContent ( element ) {
145
+ element . innerHTML = '' ;
146
+ // Whenever a Lit-based renderer is used, it assigns a Lit part to the node it was rendered into.
147
+ // When clearing the rendered content, this part needs to be manually disposed of.
148
+ // Otherwise, using a Lit-based renderer on the same node will throw an exception or render nothing afterward.
149
+ delete element . _$litPart$ ;
150
+ }
151
+
135
152
/** @private */
136
153
__itemsOrRendererChanged ( items = [ ] , renderer , virtualizer ) {
137
- if ( renderer && virtualizer ) {
154
+ // If the renderer is removed but there are elements created by
155
+ // a previous renderer, we need to request an update from the virtualizer
156
+ // to get the already existing elements properly cleared.
157
+ const hasRenderedItems = this . childElementCount > 0 ;
158
+
159
+ if ( ( renderer || hasRenderedItems ) && virtualizer ) {
138
160
if ( items . length === virtualizer . size ) {
139
161
virtualizer . update ( ) ;
140
162
} else {
0 commit comments