Lit-Element不允许我在html中设置属性值

时间:2018-10-12 15:21:22

标签: polymer lit-element lit-html

我正在处理的特定元素有问题。出于某种原因,这个选项不允许我在html标记上指定任何属性值。

如果我在构造器中指定默认值,则该元素可以很好地使用这些默认值,但是我无法通过声明性html覆盖默认值。

这是元素:

class OstinatoFetchTriggers extends LitElement {
  static get properties() {
    return {
      /**
        * The query selector for the `ostinato-fetch` element to use when
        * making the request.
        */
      xhrSelector: { type: String },

      /**
      * Elements with the trigger selector will have their click event
      * intercepted and will make the request via ostinato-fetch
      */
      triggerSelector: { type: String },
    };
  }


  constructor() {
    super();
    this.xhrSelector = '#xhrContent';
    this.triggerSelector = '[xhr-link]';
  }

  connectedCallback() {
    super.connectedCallback();

    // The output for console log below is null or whatever the default was in the contructor.
    console.log(this.triggerSelector);

    var triggerList = document.querySelectorAll(this.triggerSelector);
    triggerList.forEach((trigger) => {
      trigger.addEventListener('click', this._handleXhrClick.bind(this));
    });
  }

  disconnectedCallback() {
    super.disconnectedCallback();
    var triggerList = document.querySelectorAll(this.triggerSelector);
    triggerList.forEach((trigger) => {
      trigger.removeEventListener('click', this._handleXhrClick.bind(this));
    });
  }

  _handleXhrClick(ev) {
    ev.preventDefault();
    this.triggerRequest(ev.currentTarget.href);
  }

  triggerRequest(href) {
    document.querySelector(this.xhrSelector).fetch(href);
  }
}

customElements.define('ostinato-fetch-triggers', OstinatoFetchTriggers);

我尝试像上面这样使用上面的元素:<ostinato-fetch-triggers xhr-selector="#somethingElse"></ostinato-fetch-triggers>

我期望的是元素中的xhrTriggers属性应该为#somethingElse,但事实并非如此。它基本上只使用构造函数中的默认值。

1 个答案:

答案 0 :(得分:2)

首先:由于lit-element没有像通过Polymer 2那样将驼峰大小写转换为破折号来将属性名称映射为属性名称的概念,因此,如果声明xhrSelector,则必须使用:

<ostinato-fetch-triggers xhrSelector="#somethingElse"></ostinato-fetch-triggers>

第二个:connectedCallback是本机lifecycle callback,不是来自lit-element的,这意味着不能保证调用它的lit-element已经设置了属性。如果您想在每次更改属性时都做出反应,可以使用firstUpdated(changedProperties)update(changedProperties)

有关元素lifecycle的更多信息。


第三:在disconnectedCallback中,您似乎想删除侦听器,但这将无法正常工作,因为每次执行bind函数时,它将返回新函数,这意味着您尝试删除该函数。从未添加过。

您应该将侦听器保留在某个变量中

let listener = this._handleXhrClick.bind(this)
trigger.addEventListener('click', listener)
this.listeners.push({ trigger, listener })

然后在disconnectedCallback

this.listeners.forEach(({ trigger, listener }) => {
  listener.removeEventListener('click', listener)
})