【发布时间】:2020-06-26 20:02:25
【问题描述】:
在以下(简化的)代码中,第一个 Tester 实例使用预定义的模板,而第二个使用直接编码的模板。插值适用于第二个,因为 html 包含正确的 HTML 代码。在插值期间,第一个 Tester 实例仍然具有
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Web Components Demo</title>
</head>
<body>
<div id="tc"></div>
<div id="tc2"></div>
<script>
class TestComponent extends HTMLElement {
constructor () {
super();
this.attachShadow({mode: "open"});
this.shadowRoot.appendChild(this.createTemplate().content.cloneNode(true));
}
createTemplate () {
const template = document.createElement("template");
template.innerHTML = "<h1>{{title}}</h1><p>{{text}}</p>";
return template;
}
}
window.customElements.define("test-component", TestComponent);
class Tester {
constructor ({selector, stuff, template}) {
this.selector = Array.from(document.querySelectorAll(selector));
this.template = template || null;
this.stuff = stuff;
this.render();
this.interpolate();
}
render () {
this.selector.forEach(s => {if (this.template) s.innerHTML = this.template});
}
interpolate () {
this.selector.forEach(s => {
for (let key in this.stuff) {
const regex = new RegExp(`{{ *${key} *}}`, "g");
s.innerHTML = s.innerHTML.replace(regex, this.stuff[key]);;
}
});
}
}
new Tester ({
selector: "#tc",
stuff: {title: "Test Title", text: "Lorem ipsum dolor sit amet"},
template: "<test-component>"
});
new Tester ({
selector: "#tc2",
stuff: {title: "Title that works", text: "Lorem ipsum dolor sit amet"},
template: "<h1>{{title}}</h1><p>{{text}}</p>"
})
</script>
</body>
</html>
【问题讨论】:
标签: javascript interpolation web-component