htmx: htmx + Alpine template tag

Join the AI Workshop to learn more about AI and how it can be applied to web development. Next cohort February 1st, 2026

The AI-first Web Development BOOTCAMP cohort starts February 24th, 2026. 10 weeks of intensive training and hands-on projects.


I used Alpine’s <template> tag for something on my site, and inside this template tag I used some htmx to power a form.

The template was defined like this:

<template x-if="$store.showModal">
  <form>...</form>
</template>

Problem was, my form only sent GET requests (the default browser behavior) because how template tags work in Alpine is, the HTML is added to the DOM when the template x-if directive resolves to true.

So basically htmx had no idea about this new HTML.

I had to re-process the form by adding an id to the form and then using something like

htmx.process(htmx.find('#form-edit-project-name'))

Where to add this code?

Inside the x-init attribute in the template.

But x-init is ran when the element is processed by Alpine (you can test with x-init="console.log('test')").

You want to check, inside x-init, for when the condition is true, and then run the htmx processing.

Like this:

<template
  x-if="$store.showModal"
  x-init=`
    $watch('$store.showModal', () => {
      if ($store.showModal === true) {
        htmx.process(htmx.find('#form-edit-project-name'))
      }
    })`
>
  <form id="form-edit-project-name">...</form>
</template>

Lessons in this unit:

0: Introduction
1: Why htmx
2: The core idea of htmx
3: Installing htmx
4: Doing a GET request
5: Swap
6: POST request
7: Targets
8: Loading indicator
9: Confirming actions, and prompts
10: Triggers
11: Request headers
12: Response headers
13: Events
14: Redirect after request
15: Send files using htmx.ajax()
16: Perform something on page load
17: Conditionally hide HTML elements based on HTMX request status
18: ▶︎ htmx + Alpine template tag
19: htmx, include hidden input fields outside of a form
20: htmx trigger request via JS event