Skip to content

Modifier characters

Greg Bowler edited this page Feb 25, 2023 · 19 revisions

Bind key modifier characters are special characters that you can add to an element's bind key to add special behaviour.

An example of what this may look like is <button name="do" value="delete" data-bind:disabled="?!isActive">Delete</button>, and <img src="/photo.jpg" data-bind:class=":size" />.

Token modifier :

Adding a colon as the first character of the bind key will have the effect of toggling a token's presence, such as in the element's classList.

The "token" in this case is represented by a DOMTokenList object in the underlying DOM implementation, and represents a set of space-separated tokens. Such a set is returned by Element.classList or HTMLLinkElement.relList, and many others. See DOMTokenList on MDN for more information.

It's very common in web user interfaces to want to add or remove a string token to the class attribute. Using the DOM, this can be achieved by doing $element->classList->add("selected");, for example.

HTML:

<img src="/cat.jpg" alt="My cat" data-bind:class=":imageCategory" />

This image element will add a token to the class attribute according to the value of imageCategory.

PHP:

function example(DocumentBinder $binder):void {
	$binder->bindKeyValue("imageCategory", "cat-photo");
}

Output HTML:

<img src="/cat.jpg" alt="My cat" class="cat-photo" />

Space-separated token modifier

The name of the class you wish to toggle can be added to the HTML, using a space to separate it from the bind key.

HTML:

<img class="sidebar" src="/cat.jpg" alt="My cat" data-bind:class=":deletedAt deleted" />

This image element will add the deleted token to the class attribute if the deletedAt bind key is not falsey.

PHP:

function example(DocumentBinder $binder, DateTime|null $dateOfDeletion):void {
	$binder->bindKeyValue("deletedAt", $dateOfDeletion);
}

Output HTML:

<img class="sidebar deleted" src="/cat.jpg" alt="My cat" />

or if the $dateOfDeletion variable is null:

<img class="sidebar" src="/cat.jpg" alt="My cat" />

Attribute modifier @

The at character can be added as the first character of the bind key to indicate that the bind key should reference another attribute's value. This feature exists to remove repetition in the HTML - if an element has a name attribute with the value of country, and the bind key should also be country, the name attribute can be referenced using the attribute modifier. This means that if the name attribute's value ever changes, so will the bind key.

HTML:

<input name="country" data-bind:value="@name" />

PHP:

function example(DocumentBinder $binder):void {
	$binder->bindKeyValue("country", "TW");
}

Output HTML:

<input name="country" value="TW" />

Boolean modifier ?

Adding a question mark as the first character of the bind key can be used to toggle the presence of any attribute, depending on whether the bound value is truthy.

For example, data-bind:disabled="?deletedAt can be used to toggle the disabled attribute on the element when the deletedAt value is anything that loosely equals true.

HTML:

<button name="do" value="delete" data-bind:disabled="?deletedAt">Delete me</button>

PHP:

function example(DocumentBinder $binder, DateTime|null $deletedAt):void {
	$binder->bindKeyValue("deletedAt", $deletedAt);
}

Output HTML:

<button name="do" value="delete" disabled>Delete me</button>

or if the $deletedAt variable is null:

<button name="do" value="delete">Delete me</button>

Inverse boolean modifier ?!

The boolean modifier checks for a truthy value, but this can be inverted to check for a falsey value by adding an exclamation mark after the question mark. This is useful for when you only want to add an attribute when a value is falsey, for example data-bind:disabled="?!active" will add the disabled attribute when the active bind key is falsey.

Boolean value modifier =

This modifier character is currently in development, and will be released with the next version. It's intended to make it easier to add the checked attribute to a set of radio buttons.


Next, learn how to inject data into HTML with {{curly braces}}.