Binding HTML Boolean Attributes in Aurelia
I’ve noticed before how HTML defines attributes such as multiple which don’t take values but I didn’t appreciate that the HTML specification has a term for these - boolean attributes. And so I came across this term when I was trying to bind multiple in a <select> using Aurelia. Take the following Aurelia template as an example:
<select multiple>
<option repeat.for="item in items">${item.label}</option>
</select>
This is ok but what if I have a view model property called allowMultiple which indicates whether multiple should be added or not. I can’t use multiple.bind="allowMultiple" since that will bind the boolean result to the attribute as either multiple="true" or multiple="false".
Unfortunately Aurelia doesn’t support this (yet) but it’s easy enough to work around.
First create a custom attribute:
import {inject} from "aurelia-framework";
@inject(Element)
export class MultipleIfCustomAttribute {
constructor(element) {
this.element = element;
}
valueChanged(newValue) {
if (newValue) {
this.element.setAttribute("multiple", "");
} else {
this.element.removeAttribute("multiple");
}
}
}
Now bind to the attribute allowing it to control whether multiple should appear or not:
<select multiple-if.bind="allowMultiple">
...
</select>
I think that’s a nice simple approach although I’m hoping Aurelia might adopt something like multiple.if="allowMultiple" in the future so I don’t have to create a custom attribute for every boolean attribute (though I can’t imagine they are many!)