我正在使用 Go、HTMX、Templ 作为 TechStack 实现一个小型业余爱好项目。因为我是新手,所以我开始了一个小游乐场并尝试构建一些小型搜索。
现在我面临的问题是,我的处理程序方法在开始时只调用一次:
package main
import (
"net/http"
"github.com/go-chi/chi/v5"
)
func main() {
router := chi.NewRouter()
router.Get("/", indexHandler().ServeHTTP)
router.Get("/employee_search", employeeSearchHandler().ServeHTTP)
http.ListenAndServe(":3000", router)
}
基本思想是,如果有人在搜索框中搜索,employeeSearchHandler 就会更新 UI 以显示一些结果。
目前处理程序仅生成随机数:
func employeeSearchHandler() *templ.ComponentHandler {
var employee = rand.IntN(1000)
fmt.Println(employee)
return templ.Handler(employee_search.EmployeeResult(employee))
}
我的模板如下所示:
templ EmployeeSearch() {
<input type="search" name="search" placeholder="Suchen" aria-label="Search" autocomplete="off"
hx-get="/employee_search"
hx-trigger="input delay:500ms changed"
hx-target="#employee_result"
hx-swap="innerHTML" />
<div id="employee_result">
</div>
}
现在我想知道每次我打字并按预期停止 500 毫秒时,我的浏览器都会显示一个新请求,但它总是返回完全相同的 HTML。随机数没有改变。我也在服务器控制台中看到了这种行为。该号码在启动时生成,之后就不再创建。即使 HTMX 事件正在触发,但它只是始终发送回相同的 HTML。
我在这里监督什么?
我明白了:
在 main.go 中,现在看起来像这样:
func main() {
router := chi.NewRouter()
//router.Get("/", indexHandler().ServeHTTP)
router.Get("/employee_search", employeeSearchHandler)
http.ListenAndServe(":3000", router)
}
所以我不调用方法employeeSearchHandler,只是将func 作为参数传递。然后处理程序本身传递 Response、Request 对象:
func employeeSearchHandler(w http.ResponseWriter, r *http.Request) {
var employee = rand.IntN(1000)
templ.Handler(employee_search.EmployeeResult(employee)).ServeHTTP(w, r)
}
这样它就会按照我的预期在每次路由调用上进行更新:)