I have a custom component that should hide content when I set a boolean property to false. Every other property gets reflected except that one. I must be doing something wrong.
static get properties(){
title: {
type: String,
attribute: 'title',
},
titleEnable: {
type: Boolean,
attribute: 'title-enable',
},
}
constructor() {
super();
this.titleEnable=true;
this.title="default";
}
render(){
return html`
${this.titleEnable
? html`
<p class="title" ?hidden="${!this.titleEnable}">${this.title}</p>
`
: html ``}
`
}
If I use that component like <my-component></my-component>
in an HTML file it shows: default as expected.
If I use it like this: <my-component title="New Title"></my-component>
it displays: New Title as expected.
BUT if I try to hide it <my-component title-enable="false"></my-component>
the boolean just doesn't change. I've tried !title-enable, title-enable='false", .titleEnable=false and all the variants you can imagine. What pisses me the most is that whenever I set in the constructor 'this.titleEnable=false' and I happen to just declare the variable WITHOUT value on the tag and it takes it as TRUE an "default" appears. <my-component title-enable></my-component>
I am completely lost.
Ok, this is a tricky one. You need to handle it differently by passing some object as below:
static get properties() {
return {
titleConfig: {
type: Object,
attribute: 'title-config'
}
}
}
render() {
return html`
${this.titleConfig.titleEnable
? html`
<p class="title" ?hidden="${!this.titleConfig.titleEnable}">${this.titleConfig.title}</p>
`
: html``}
`
}
In HTML:
<my-component title-config='{"title":"shan", "titleEnable": false}'></my-component>
Now, the question is why it is true
every time?
Answer: For a Boolean property to be configurable from markup, it must default to false. If it defaults to true, you cannot set it to false from markup, since the presence of the attribute, with or without a value, equates to true. This is the standard behavior for attributes in the web platform.
It is taken from polymer doc.
So, by creating an attribute title-enable
, the HTML
considers this attribute as true
It's really a bummer for someone who starts working on Polymer or LitElement .
According to the documentation:
To bind to a boolean attribute you need to use the "?", notation:
Bind prop3 to a boolean attribute:
html`<input type="text" ?disabled="${this.prop3}">`
Boolean attributes are added if the expression evaluates to a truthy value, and removed if it evaluates to a falsy value.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With