此示例展示了如何实现可编辑行。首先,让我们看看表格主体:
<table class="table delete-row-example">
<thead>
<tr>
<th>姓名</th>
<th>电子邮件</th>
<th></th>
</tr>
</thead>
<tbody hx-target="closest tr" hx-swap="outerHTML">
...
</tbody>
</table>
这将指示表格内的请求针对触发请求的最接近的包围行,并替换整个行。
以下是行的 HTML:
<tr>
<td>${contact.name}</td>
<td>${contact.email}</td>
<td>
<button class="btn danger"
hx-get="/contact/${contact.id}/edit"
hx-trigger="edit"
onClick="let editing = document.querySelector('.editing')
if(editing) {
Swal.fire({title: '正在编辑',
showCancelButton: true,
confirmButtonText: '是的,编辑此行!',
text:'嘿!你已经在编辑一行了!你想取消该编辑并继续吗?'})
.then((result) => {
if(result.isConfirmed) {
htmx.trigger(editing, 'cancel')
htmx.trigger(this, 'edit')
}
})
} else {
htmx.trigger(this, 'edit')
}">
编辑
</button>
</td>
</tr>
在这里,我们稍微复杂化,只允许一次编辑一行,使用一些 JavaScript。
我们检查是否有带有 .editing 类的行,并确认用户想要编辑此行
并取消另一个。如果是,我们向另一个行发送取消事件,以便它发出请求返回
到其初始状态。
然后,我们在当前元素上触发 edit 事件,这会触发 htmx 请求以获取行的可编辑版本。
请注意,如果您不在乎用户是否编辑多行,您可以省略 hyperscript 和自定义 hx-trigger,
并让正常的点击处理与 htmx 一起工作。您也可以通过在点击“编辑”按钮时针对整个表格来实现互斥。
在这里,我们想要展示如何集成 htmx 和 JavaScript 来解决问题并缩小服务器交互一点,而且我们可以使用一个不错的 SweetAlert 确认对话框。
最后,以下是编辑数据时行的样子:
<tr hx-trigger='cancel' class='editing' hx-get="/contact/${contact.id}">
<td><input autofocus name='name' value='${contact.name}'></td>
<td><input name='email' value='${contact.email}'></td>
<td>
<button class="btn danger" hx-get="/contact/${contact.id}">
取消
</button>
<button class="btn danger" hx-put="/contact/${contact.id}" hx-include="closest tr">
保存
</button>
</td>
</tr>
在这里,我们有几件事发生:首先,行本身可以响应 cancel 事件,这将带回
行的只读版本。有一个取消按钮允许
取消当前编辑。最后,有一个保存按钮发出 PUT 来更新联系人。请注意
有一个 hx-include,它包含最近的行中的所有输入。表格行由于 HTML 约束(您不能直接将 form 放在 tr 内)而 notoriously 难以与表单一起使用,因此
这使得事情更容易处理。