Skip to content

Commit 0a07d0d

Browse files
committed
fix: enhance rendering logic and event dispatching for HTML elements
1 parent 4c53373 commit 0a07d0d

File tree

1 file changed

+41
-10
lines changed

1 file changed

+41
-10
lines changed

src/index.js

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

255273
async 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

Comments
 (0)