Loading...
Loading...
Apply Better Stimulus best practices for writing maintainable, reusable StimulusJS controllers following SOLID principles
npx skill4agent add obie/skills better-stimulustoggle() {
this.element.classList.toggle("active")
}static classes = ["active"]
toggle() {
this.element.classList.toggle(this.activeClass)
}<div data-controller="toggle" data-toggle-active-class="active"></div>connect() {
this.count = 0
}static values = { count: Number }
countValueChanged(count) {
this.updateDisplay()
}connect()connect()data-actiondata-actionaddEventListener()connect() {
document.addEventListener("click", this.handler.bind(this))
}<div data-action="click@document->controller#handler"></div>references/architecture.md[name]ValueChangedreferences/state-management.mdconnect()connect()disconnect()connect()teardown()references/lifecycle.mdreferences/events-and-interaction.mdreferences/solid-principles.md<template>requestSubmit()submit()references/dom-and-turbo.mdhandleError()references/error-handling.mdstatic values = {
url: String,
count: Number,
enabled: Boolean,
items: Array,
config: Object
}<!-- Element events -->
<div data-action="click->controller#method">
<!-- Global events -->
<div data-action="resize@window->controller#layout">
<div data-action="keydown@document->controller#handleKey">
<!-- Multiple actions -->
<div data-action="click->ctrl1#method1 click->ctrl2#method2">// Dispatch
const event = new CustomEvent('name:action', {
bubbles: true,
detail: { key: 'value' }
})
this.element.dispatchEvent(event)
// Listen
data-action="name:action->controller#handler"<div data-controller="parent"
data-parent-child-outlet=".child">
<div class="child" data-controller="child"></div>
</div>static outlets = ['child']
this.childOutlets.forEach(outlet => outlet.method())connect() // Element connected to DOM
disconnect() // Element removed from DOM
[name]TargetConnected(element) // Target added
[name]TargetDisconnected(element) // Target removed
[name]ValueChanged(value, oldValue) // Value changed
[name]OutletConnected(outlet) // Outlet connected
[name]OutletDisconnected(outlet) // Outlet disconnectedconnect()addEventListener().bind()submit()requestSubmit()references/architecture.mdreferences/state-management.mdreferences/lifecycle.mdreferences/events-and-interaction.mdreferences/solid-principles.mdreferences/dom-and-turbo.mdreferences/error-handling.md