Паттерн фасад предназначен для упрощения взаимодействия с комплексной системой, предоставляя единый интерфейс к множеству компонентов. В JavaScript-фреймворке Stimulus это позволяет централизовать управление поведением страницы через контроллер, скрывая внутренние детали взаимодействия между различными элементами и контроллерами.
Stimulus строится на основе контроллеров, которые
привязываются к DOM-элементам через data-controller. Каждый
контроллер может содержать targets,
actions и values, создавая
декларативную связь между DOM и логикой. При использовании фасада
контроллер становится точкой доступа к сложным взаимодействиям между
несколькими компонентами, обеспечивая удобство и читаемость кода.
Фасадный контроллер объединяет несколько дочерних контроллеров или элементов страницы. Основная задача — предоставить методы высокого уровня для внешнего кода, скрывая низкоуровневые детали.
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["modal", "form", "submitButton"]
connect() {
this._initializeModal()
this._bindFormEvents()
}
openModal() {
this.modalTarget.classList.add("is-active")
}
closeModal() {
this.modalTarget.classList.remove("is-active")
}
submitForm() {
this.submitButtonTarget.disabled = true
this.formTarget.requestSubmit()
}
_initializeModal() {
// Логика инициализации модального окна
console.log("Modal initialized")
}
_bindFormEvents() {
this.formTarget.addEventListener("submit", (event) => {
event.preventDefault()
this._handleFormSubmission()
})
}
_handleFormSubmission() {
// Сложная логика обработки формы
console.log("Form submitted")
this.closeModal()
this.submitButtonTarget.disabled = false
}
}
В этом примере фасадный контроллер объединяет управление модальным
окном и формой. Внешние компоненты могут вызывать
openModal, closeModal и
submitForm, не заботясь о деталях внутренней логики.
Stimulus поддерживает параметры и targets, что позволяет фасаду управлять несколькими зависимостями. Пример: контроллер, который управляет несколькими виджетами на странице.
static targets = ["widget"]
highlightAllWidgets() {
this.widgetTargets.forEach(widget => widget.classList.add("highlight"))
}
resetWidgets() {
this.widgetTargets.forEach(widget => widget.classList.remove("highlight"))
}
Использование фасада обеспечивает:
Фасад удобно использовать для управления асинхронными процессами, такими как загрузка данных с сервера, отображение индикаторов загрузки и обработка ошибок.
async fetchData(url) {
try {
this._showLoading()
const response = await fetch(url)
const data = await response.json()
this._renderData(data)
} catch (error) {
this._handleError(error)
} finally {
this._hideLoading()
}
}
_showLoading() {
this.element.classList.add("loading")
}
_hideLoading() {
this.element.classList.remove("loading")
}
_renderData(data) {
console.log("Data received:", data)
}
_handleError(error) {
console.error("Error fetching data:", error)
}
Фасад позволяет объединить визуальные состояния и обработку данных в одном контроллере, делая вызовы простыми и предсказуемыми.
Фасад в Stimulus часто комбинируется с:
Такое сочетание позволяет строить сложные интерфейсы с минимальной связностью и высокой читаемостью.
async/await для управления процессами.Фасад в Stimulus позволяет создать четкий слой абстракции над сложной системой компонентов, улучшая поддерживаемость и читаемость кода, особенно в больших веб-приложениях.