wire:model
The wire:model directive creates two-way data binding between form inputs and component data properties. As users type or interact with form elements, the values are automatically synchronized with your server-side data, enabling reactive forms without manual event handling.
Basic Usage
This user profile form demonstrates wire:model with various input types and live updating:
// wires/UserProfile.bx
class extends="cbwire.models.Component" {
data = {
"name": "",
"email": "",
"bio": "",
"notifications": true,
"preferences": [],
"country": ""
};
function save() {
// Save user profile
sleep(1000);
}
}// wires/UserProfile.cfc
component extends="cbwire.models.Component" {
data = {
"name" = "",
"email" = "",
"bio" = "",
"notifications" = true,
"preferences" = [],
"country" = ""
};
function save() {
// Save user profile
sleep(1000);
}
}<!-- wires/userProfile.bxm -->
<bx:output>
<form wire:submit="save">
<input type="text" wire:model.live.debounce.300ms="name" placeholder="Name">
<input type="email" wire:model.blur="email" placeholder="Email">
<textarea wire:model="bio" placeholder="Bio"></textarea>
<input type="checkbox" wire:model="notifications"> Email notifications
<input type="checkbox" value="updates" wire:model="preferences"> Product updates
<input type="checkbox" value="marketing" wire:model="preferences"> Marketing
<select wire:model="country">
<option value="">Select country</option>
<option value="US">United States</option>
<option value="CA">Canada</option>
</select>
<button type="submit">Save Profile</button>
</form>
</bx:output><!-- wires/userProfile.cfm -->
<cfoutput>
<form wire:submit="save">
<input type="text" wire:model.live.debounce.300ms="name" placeholder="Name">
<input type="email" wire:model.blur="email" placeholder="Email">
<textarea wire:model="bio" placeholder="Bio"></textarea>
<input type="checkbox" wire:model="notifications"> Email notifications
<input type="checkbox" value="updates" wire:model="preferences"> Product updates
<input type="checkbox" value="marketing" wire:model="preferences"> Marketing
<select wire:model="country">
<option value="">Select country</option>
<option value="US">United States</option>
<option value="CA">Canada</option>
</select>
<button type="submit">Save Profile</button>
</form>
</cfoutput>What wire:model Does
When you add wire:model to an input, CBWIRE automatically:
Binds Data: Creates two-way binding between input values and component properties
Syncs Changes: Updates server data when users interact with form elements
Preserves State: Maintains input values across component re-renders
Handles Types: Automatically manages different input types (text, checkbox, select, etc.)
Available Modifiers
The wire:model directive supports these modifiers:
Live:
.live- Sends updates as user types (with 150ms debounce)Blur:
.blur- Only sends updates when input loses focusChange:
.change- Only sends updates on change eventLazy:
.lazy- Prevents server updates until an action is calledDebounce:
.debounce.Xms- Customizes debounce timing (e.g.,.debounce.500ms)Throttle:
.throttle.Xms- Throttles network requests by X millisecondsNumber:
.number- Casts text input to integer on serverBoolean:
.boolean- Casts text input to boolean on serverFill:
.fill- Uses initial HTMLvalueattribute during page load
Combine modifiers as needed: wire:model.live.debounce.500ms="username"
Input Types
Text Inputs
<input type="text" wire:model="name">
<input type="email" wire:model="email">
<input type="password" wire:model="password">Textarea
<textarea wire:model="content"></textarea>Don't initialize textarea content with the property value in the template:
<!-- ❌ Don't do this -->
<textarea wire:model="content">#content#</textarea>
<!-- ✅ Do this instead -->
<textarea wire:model="content"></textarea>Single Checkbox
<input type="checkbox" wire:model="receiveUpdates">The checkbox will be checked if the data property is true, unchecked if false.
Multiple Checkboxes
// Component data
data = {
"selections": []
};// Component data
data = {
"selections" = []
};<input type="checkbox" value="email" wire:model="selections">
<input type="checkbox" value="sms" wire:model="selections">
<input type="checkbox" value="notification" wire:model="selections">Radio Buttons
<input type="radio" value="yes" wire:model="sendEmail">
<input type="radio" value="no" wire:model="sendEmail">Select Dropdowns
<select wire:model="state">
<option value="AL">Alabama</option>
<option value="AK">Alaska</option>
<option value="AZ">Arizona</option>
</select>Livewire automatically adds the selected attribute to the matching option.
Dynamic Select Options
function getStates() {
return queryExecute("select id, label from states");
}function getStates() {
return queryExecute("select id, label from states");
}<select wire:model="state">
<option disabled value="">Select a state</option>
<bx:loop array="#getStates()#" index="state">
<option value="#state.id#">#state.label#</option>
</bx:loop>
</select><select wire:model="state">
<option disabled value="">Select a state</option>
<cfloop array="#getStates()#" index="state">
<option value="#state.id#">#state.label#</option>
</cfloop>
</select>Dependent Dropdowns
Use wire:key to ensure dependent dropdowns update properly:
<!-- State selector -->
<select wire:model.live="state">
<option disabled value="">Select a state</option>
<bx:loop array="#getStates()#" index="state">
<option value="#state.id#">#state.label#</option>
</bx:loop>
</select>
<!-- City selector (depends on state) -->
<select wire:model.live="city" wire:key="#state#">
<option disabled value="">Select a city</option>
<bx:loop array="#getCities(state)#" index="city">
<option value="#city.id#">#city.label#</option>
</bx:loop>
</select><!-- State selector -->
<select wire:model.live="state">
<option disabled value="">Select a state</option>
<cfloop array="#getStates()#" index="state">
<option value="#state.id#">#state.label#</option>
</cfloop>
</select>
<!-- City selector (depends on state) -->
<select wire:model.live="city" wire:key="#state#">
<option disabled value="">Select a city</option>
<cfloop array="#getCities(state)#" index="city">
<option value="#city.id#">#city.label#</option>
</cfloop>
</select>Multi-Select Dropdowns
<select wire:model="states" multiple>
<option value="AL">Alabama</option>
<option value="AK">Alaska</option>
<option value="AZ">Arizona</option>
</select>Last updated
Was this helpful?