Директива bind является одной из ключевых возможностей
Slim.js для связывания данных с DOM-элементами. Она позволяет
синхронизировать значения свойств компонентов с атрибутами HTML,
обеспечивая реактивное обновление интерфейса при изменении состояния
модели.
Простейший синтаксис выглядит так:
<input type="text" bind="value: username">
В этом примере свойство username компонента
автоматически связывается с атрибутом value элемента
input. Любое изменение значения username
обновляет поле ввода, а изменение текста в поле ввода изменяет
username.
Общий формат директивы:
bind="атрибут: свойство[, атрибут2: свойство2 ...]"
value, checked, disabled,
innerHTML, src).two-way)
используется для <input>,
<textarea>, <select> и других
элементов формы. При изменении значения элемента DOM оно обновляет
свойство компонента, а при изменении свойства компонента — DOM.one-way)
применяется, когда требуется только отображение данных без изменения их
через интерфейс. Для этого можно использовать просто выражение в
атрибуте:<img bind="src: profileImage">
Изменение profileImage обновит источник изображения, но
изменение элемента DOM не изменяет свойство.
Slim.js поддерживает связывание нескольких атрибутов с разными свойствами в одной директиве:
<button bind="disabled: isButtonDisabled, title: buttonTitle">
Нажми меня
</button>
Здесь одновременно обновляются атрибут disabled и
title в зависимости от состояния компонента.
Директива bind может работать не только с простыми
свойствами, но и с выражениями или методами компонента, возвращающими
значение:
<div bind="innerHTML: getWelcomeMessage()"></div>
Метод getWelcomeMessage() возвращает строку, которая
будет вставлена в innerHTML элемента. Любое изменение
данных, используемых в методе, автоматически вызовет обновление DOM при
правильной реактивной настройке.
Для атрибутов типа checked, disabled,
hidden важно, чтобы привязываемое свойство имело булево
значение. Slim.js автоматически добавляет или удаляет атрибут в
зависимости от значения свойства:
<input type="checkbox" bind="checked: isSubscribed">
Если isSubscribed = true, чекбокс будет отмечен, если
false — снят.
Хотя директива bind напрямую не обрабатывает события,
она тесно интегрируется с реактивной системой Slim.js. Изменение
DOM-элемента через пользовательское действие (например, ввод текста)
автоматически обновляет свойство компонента. Для более сложного контроля
событий используется директива on.
bind работает только с существующими свойствами
компонента. Неинициализированные поля не будут корректно
обновляться.this.set,
this.update) вместо прямого присваивания, чтобы изменения
корректно отражались в DOM.bind.Пример с формой:
<form>
<input type="text" bind="value: firstName" placeholder="Имя">
<input type="text" bind="value: lastName" placeholder="Фамилия">
<input type="checkbox" bind="checked: subscribeNewsletter"> Подписка на новости
<button bind="disabled: !firstName || !lastName">Отправить</button>
</form>
Изменение значений полей автоматически влияет на состояние кнопки и чекбокса, обеспечивая полностью реактивный интерфейс без дополнительных слушателей событий.
Пример с изображением и динамическим контентом:
<img bind="src: userAvatar" alt="Аватар пользователя">
<p bind="innerHTML: getUserDescription()"></p>
Любое обновление данных userAvatar или возвращаемого
значения getUserDescription() немедленно отразится в
DOM.
Директива bind в Slim.js является основой реактивного
взаимодействия между моделью и представлением, позволяя создавать
динамичные и интерактивные интерфейсы с минимальным количеством кода.
Она обеспечивает чистую и простую синхронизацию данных и DOM без ручного
управления событиями и обновлениями атрибутов.