将标题设置为 Web 组件上的属性会触发最大调用堆栈
2017-10-04
553
我正在开发一个导航链接 Web 组件。我想在组件上设置的属性之一是标题。这似乎以某种方式触发了最大调用堆栈错误。我应该完全避免使用
title
吗?我可以改用
caption
。
第一个错误
类“NavLinkCmp”错误地扩展了基类“HTMLElement”。
属性“title”在类型“NavLinkCmp”中是私有的,但在类型“HTMLElement”中不是。
第二个错误
nav-link.cmp.ts:72 Uncaught RangeError: Maximum call stack size exceeded.
at HTMLElement.attributeChangedCallback (nav-link.cmp.ts:72)
navigator-cmp.ts
<nav-link-cmp href="${link.url}" fa-icon="${link.icon}"
title="${link.title}" description="${link.description}">
</nav-link-cmp>
nav-link-cmp.ts
export class NavLinkCmp extends HTMLElement {
// State
private title: string;
constructor() {
super();
}
connectedCallback() {
this.render();
}
render() {
this.innerHTML = `
<div class="info">
<div class="title">${this.title}</div>
</div>
`;
}
static get observedAttributes() {
return ['title'];
}
attributeChangedCallback(name: string, oldValue: string, newValue: string) {
this.title = newValue
}
}
// Component
require('./nav-link.cmp.scss');
window.customElements.define('nav-link-cmp', NavLinkCmp);
2个回答
尝试此操作:
attributeChangedCallback(name: string, oldValue: string, newValue: string) {
if (oldValue !== newValue) {
this.title = newValue;
}
}
如果
oldValue
和
newValue
相同,则无需再次设置该属性。
如果您这样做,它会更改属性,然后再次调用
attributeChangedCallback
并永远循环。
Intervalia
2017-11-22
无限循环是由 attributeChangedCallback 中的 'title' 值的变化引起的。 由于此函数在 title 属性每次发生变化时都会被调用,因此它会一遍又一遍地调用……
为什么不能直接使用父类 title 属性?
Renaud T.
2017-10-04