Lit-Element 不允许我在 html 中设置 属性 值
Lit-Element doesn't let me set property value in 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
,但事实并非如此。它基本上只使用构造函数的默认值。
首先:由于 lit-element 没有像 Polymer 2 那样通过将驼峰式大小写转换为破折号式来将 属性 名称映射到属性名称的概念。因此,如果您声明 xhrSelector
, 你必须使用:
<ostinato-fetch-triggers xhrSelector="#somethingElse"></ostinato-fetch-triggers>
其次:connectedCallback
是原生的 lifecycle callback 而不是来自 lit-element
,这意味着当它调用 lit-element
时无法保证已经设置了属性。如果您想在每次更改 属性 时做出反应,您可以使用 firstUpdated(changedProperties)
或 update(changedProperties)
。
详细了解 lit-element lifecycle。
第三:在disconnectedCallback
中,你似乎想删除监听器,但这不会起作用,因为每次你执行bind
函数时,它都会return新函数,这意味着您尝试删除以前从未添加的功能。
你应该让监听器保持在某个变量中
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)
})
我对正在处理的特定元素有疑问。出于某种原因,这个不允许我在 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
,但事实并非如此。它基本上只使用构造函数的默认值。
首先:由于 lit-element 没有像 Polymer 2 那样通过将驼峰式大小写转换为破折号式来将 属性 名称映射到属性名称的概念。因此,如果您声明 xhrSelector
, 你必须使用:
<ostinato-fetch-triggers xhrSelector="#somethingElse"></ostinato-fetch-triggers>
其次:connectedCallback
是原生的 lifecycle callback 而不是来自 lit-element
,这意味着当它调用 lit-element
时无法保证已经设置了属性。如果您想在每次更改 属性 时做出反应,您可以使用 firstUpdated(changedProperties)
或 update(changedProperties)
。
详细了解 lit-element lifecycle。
第三:在disconnectedCallback
中,你似乎想删除监听器,但这不会起作用,因为每次你执行bind
函数时,它都会return新函数,这意味着您尝试删除以前从未添加的功能。
你应该让监听器保持在某个变量中
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)
})