我有以下ELM视图元素:
Html.node "test-elem"
[ Attributes.attribute "data-count" (model.count |> String.fromInt) ]
[]
test-elem 是一个自定义的 HTML 元素:
constructor() {
super();
this.me = this;
}
connectedCallback() {
console.info(this.dataset.count);
this.div = document.createElement("div");
this.appendChild(this.div);
this.div.innerText = "" + this.dataset.count;
}
attributeChangedCallback() {
console.info(this.dataset.count);
this.div.innerText = "" + this.dataset.count;
}
如果 model.count 发生更改,则不会重新生成自定义元素。我该如何强制这样做?
https://ellie-app.com/6SRrZjCzwfra1
根据@Robin的建议进行了编辑,但没有运气。
我认为您的 Elm 代码没有任何问题,我认为这是您在 JavaScript 中的自定义元素定义的问题。
我不熟悉自定义元素 API,但看看你的代码(转载如下(:
customElements.define('test-elem', class TestElem extends HTMLElement {
constructor() {
super();
this.me = this;
}
connectedCallback() {
console.info(this.dataset.count);
var div = document.createElement("div");
this.appendChild(div);
div.innerText = "" + this.dataset.count;
}
});
和自定义元素的 MDN 文档,很明显您应该将connectedCallback
方法更改为attributeChangedCallback
。原因是Elm使用虚拟DOM,并且在模型更改时使实际DOM更新最少。特别是,当计数更改时,它不会从 DOM 中删除自定义元素并添加新元素,它只会更改相应的属性。看来你的connecedCallback
不会被召唤,但attributeChangedCallback
应该被召唤。
此外,正如正确观察到@Murdock的那样(通过阅读 MDN 文章,特别是"使用生命周期回调"部分,比我更好(,必须通过使用observedAttributes
getter 显式设置为观察data-count
属性,如下所示:
static get observedAttributes() {
return ['data-count'];
}