@@ -128,10 +128,14 @@ async function render({
128128 }
129129
130130 if ( ! key ) {
131- key =
132- source . getAttribute ( "render" ) ||
133- source . getAttribute ( "key" ) ||
134- data . type ;
131+ if ( source instanceof HTMLElement ) {
132+ key =
133+ source . getAttribute ( "render" ) ||
134+ source . getAttribute ( "key" ) ||
135+ data . type ;
136+ } else {
137+ key = data . type ;
138+ }
135139 if ( ! key || key === "key" ) {
136140 key = "object" ;
137141 } else if ( key === "{}" || ( ! key && data . method ) ) {
@@ -197,8 +201,17 @@ async function render({
197201 }
198202
199203 key = element [ i ] . getAttribute ( "render" ) || key ;
200- let renderType =
201- renderedNode . source . element . getAttribute ( "render-type" ) ;
204+ let renderedSource = renderedNode . source ;
205+ if ( ! renderedSource ) {
206+ if ( renderedNode . parent && renderedNode . parent . template ) {
207+ renderedSource = renderedNode . parent . template . source ;
208+ }
209+ }
210+ let renderType ;
211+ if ( renderedSource && renderedSource . element ) {
212+ renderType = renderedSource . element . getAttribute ( "render-type" ) ;
213+ }
214+
202215 let clone ;
203216 if ( remove ) {
204217 for ( let j = 0 ; j < data [ key ] . length ; j ++ ) {
@@ -250,6 +263,11 @@ async function render({
250263 await renderValues ( element [ i ] , data , key , renderAs ) ;
251264 }
252265 }
266+ // Dispatch input and change events after rendering is complete
267+ if ( source instanceof HTMLElement ) {
268+ source . dispatchEvent ( new Event ( "input" ) ) ;
269+ source . dispatchEvent ( new Event ( "change" ) ) ;
270+ }
253271}
254272
255273async function renderTemplate ( template , data , key , index , keyPath ) {
@@ -262,7 +280,8 @@ async function renderTemplate(template, data, key, index, keyPath) {
262280 renderedNodes . set ( template , templateData ) ;
263281 }
264282
265- templateData . parent = template . parentElement . closest ( "[render]" ) ;
283+ templateData . parent =
284+ template . parentElement . closest ( "[render]" ) || template . source ;
266285 if ( templateData . parent ) {
267286 templateData . parent = renderedNodes . get ( templateData . parent ) ;
268287 }
@@ -294,7 +313,10 @@ async function renderTemplate(template, data, key, index, keyPath) {
294313 }
295314 } else if ( ! renderData ) return ;
296315
297- let renderAs = template . element . getAttribute ( "render-as" ) || key ;
316+ let renderAs =
317+ template . element . getAttribute ( "render-as" ) ||
318+ template . source . element . getAttribute ( "render-as" ) ||
319+ key ;
298320 template . renderAs = renderAs ;
299321
300322 let renderType ;
@@ -406,7 +428,16 @@ async function renderTemplate(template, data, key, index, keyPath) {
406428
407429 clone . keyPath = template . keyPath || "" + `[${ i } ]` ;
408430
409- let object = { ...renderData [ i ] } ;
431+ let object ;
432+ if (
433+ typeof renderData [ i ] === "object" &&
434+ renderData [ i ] !== null
435+ ) {
436+ object = { ...renderData [ i ] } ;
437+ } else {
438+ object = renderData [ i ] ;
439+ }
440+
410441 for ( let j = 0 ; j < exclude . length ; j ++ )
411442 delete object [ exclude [ j ] ] ;
412443
@@ -1123,7 +1154,7 @@ Observer.init({
11231154 if ( mutation . target . hasAttribute ( "render-clone" ) ) return ;
11241155 let parentElement = mutation . target . parentElement . closest ( "[render]" ) ;
11251156 if ( ! parentElement ) return ;
1126- return ;
1157+
11271158 let renderedNode = renderedNodes . get ( parentElement ) ;
11281159 let data ;
11291160 if ( renderedNode . source ) {
0 commit comments