Объекты (Targets)
- Контроллеры
- Хуки жизненного цикла
- Действия (Actions)
- Объекты (Targets)
- Переменные контроллера (Values)
-
CSS классы
Объекты позволяют обращаться к важным элементам по имени.
<div data-controller="search">
<input type="text" data-search-target="query">
<div data-search-target="errorMessage"></div>
<div data-search-target="results"></div>
</div>
Атрибуты
Атрибут data-search-target называется целевым атрибутом, и его значение представляет собой разделенный пробелами список имен объектов, которые вы можете использовать для ссылки на элемент в контроллере search.
<div data-controller="search">
<div data-search-target="results"></div>
</div>
Определение
Определите имена объектов в классе контроллера, используя массив static targets:
// controllers/search_controller.js
import { Controller } from '@hotwired/stimulus';
export default class extends Controller {
static targets = [ 'query', 'errorMessage', 'results' ]
// …
}
Свойства
Для каждого имени объекта, определенного в массиве static targets, Stimulus добавляет следующие свойства в ваш контроллер, где [name] соответствует имени объекта:
| Тип | Имя | Значение |
|---|---|---|
| Единичное | this.[name]Target |
Первый совпадающий объект в области видимости |
| Множественное | this.[name]Targets |
Массив всех совпадающих объектов в области видимости |
| Наличие | this.has[Name]Target |
Булево значение, указывающее, существует ли в области видимости соответствующий объект |
Примечание: Доступ к единичному свойству объекта приведет к ошибке, если нет подходящего элемента.
Общие объекты
Элементы могут иметь более одного атрибута объекта, и часто объекты могут быть общими для нескольких контроллеров.
<form data-controller="search checkbox">
<input type="checkbox" data-search-target="projects" data-checkbox-target="input">
<input type="checkbox" data-search-target="messages" data-checkbox-target="input">
…
</form>
В приведенном выше примере флажки доступны внутри контроллера search как this.projectsTarget и this.messagesTarget, соответственно.
Внутри контроллера checkbox, this.inputTargets возвращает массив с обоими флажками.
Optional Targets
Если ваш контроллер должен работать с объектом, который может присутствовать или не присутствовать, пишите ваш код, основываясь на значении свойства наличия объекта:
if (this.hasResultsTarget) {
this.resultsTarget.innerHTML = "…"
}
Хуки добавления и удаления объектов
Хуки объектов позволяют вам реагировать всякий раз, когда объект добавляется или удаляется в элементе контроллера.
Определите метод [name]TargetConnected или [name]TargetDisconnected в контроллере, где [name] - имя объекта, за добавлениями или удалениями которого вы хотите наблюдать. Метод получает элемент в качестве первого аргумента.
Stimulus вызывает каждый хук объекта каждый раз, когда его элементы добавляются или удаляются после connect() и до disconnect() хуков жизненного цикла.
export default class extends Controller {
static targets = [ 'item' ];
itemTargetConnected(element) {
this.sortElements(this.itemTargets);
}
itemTargetDisconnected(element) {
this.sortElements(this.itemTargets);
}
// Private
sortElements(itemTargets) { /* ... */ }
}
Примечание. Во время выполнения хуков [name]TargetConnected и [name]TargetDisconnected экземпляры MutationObserver за кулисами приостанавливаются. Это означает, что если хук добавляет или удаляет объект с совпадающим именем, соответствующий хук не будет вызван снова.
Соглашение об именовании
Всегда используйте camelCase для указания имен объектов, поскольку они отображаются непосредственно на свойства вашего контроллера.