Я реализую небольшой хобби-проект с использованием 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)
}
Основная идея заключается в том, что если кто-то выполняет поиск в поле поиска, то сотрудникSearchHandler обновляет пользовательский интерфейс, чтобы показать некоторые результаты.
На данный момент обработчик генерирует только случайное число:
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.
Что я здесь контролирую?
@mkopriva ок, понятно, спасибо :). Но я не понимаю, как это должно тогда работать…

Я понял:
в main.go сейчас это выглядит так:
func main() {
router := chi.NewRouter()
//router.Get("/", indexHandler().ServeHTTP)
router.Get("/employee_search", employeeSearchHandler)
http.ListenAndServe(":3000", router)
}
Поэтому я не вызываю метод сотрудникаSearchHandler, а просто передаю функцию в качестве аргумента. Затем сам обработчик передает объекты Response, Request:
func employeeSearchHandler(w http.ResponseWriter, r *http.Request) {
var employee = rand.IntN(1000)
templ.Handler(employee_search.EmployeeResult(employee)).ServeHTTP(w, r)
}
Таким образом, он обновляется при каждом вызове маршрута, как я и ожидал :)
В Go
F()— это выражение вызова, которое вычисляется тут же и ровно столько раз, сколько выполняется вызывающий код. Функцияmain, которая является кодом вызова выраженияemployeeSearchHandler(), выполняется только один раз, независимо от того, сколько запросов принимает ваша программа. Другими словами, ваши ожидания совершенно неуместны.