开发者问题收集

将标题设置为 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;
  }
}

如果 oldValuenewValue 相同,则无需再次设置该属性。

如果您这样做,它会更改属性,然后再次调用 attributeChangedCallback 并永远循环。

Intervalia
2017-11-22

无限循环是由 attributeChangedCallback 中的 'title' 值的变化引起的。 由于此函数在 title 属性每次发生变化时都会被调用,因此它会一遍又一遍地调用……

为什么不能直接使用父类 title 属性?

Renaud T.
2017-10-04