您在问题中链接的其他答案包含实现 _“加载更多…”_功能所需的所有详细信息和技巧:更新变量golang时动态刷新模板的一部分
是的,这并非微不足道,但也不是那么困难/复杂。该答案讨论了不同的方法/替代方法,但显然一个解决方案仅需要一个。
在这里,我展示了一个可行的解决方案。
Loadmore此处的按钮不会“记住”最近返回的帖子,它只会检索2条新帖子。想一想如何实现发回最后一个ID,并在请求更多ID时在其后发送记录。
完整的,可运行的应用程序代码可以在Go
Playground上找到。当然,您不能在Go
Playground上运行它,不能将其保存在本地并在计算机上运行。
因此,我们将与以下
Post实体合作:
type Post struct { User, Time, Text string}我将使用以下模板:
<html><body><h2>Posts</h2>{{block "batch" .}} {{range .posts}} <div><b>{{.Time}} {{.User}}:</b> {{.Text}}</div> {{end}} <div id="nextBatch"></div>{{end}}<button onclick="loadMore()">Load more</button><script> function loadMore() { var e = document.getElementById("nextBatch"); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { e.outerHTML = xhr.responseText; } } xhr.open("GET", "/posts/more", true); try { xhr.send(); } catch (err) { } }</script></body></html>它包含一个
{{block "batch" .}}用于列出帖子的块,还为下一个批处理(<divid="nextBatch">)呈现一个占位符。接下来,它包含一个
LoadMore按钮,按下该按钮时,它将以呈现的形式获取下一批,并替换占位符。渲染的下一批还包含下一批的占位符。
我链接的另一个答案中详细介绍了用于进行AJAX调用的javascript函数。
执行此模板的处理程序:
var t = template.Must(template.New("").Parse(page))var lastTime = time.Now()func produceTime() string { lastTime = lastTime.Add(time.Second) return lastTime.Format("15:04:05")}func postsHandler(w http.ResponseWriter, r *http.Request) { // Put up some random data for demonstration: data:= map[string]interface{}{"posts": []Post{ {User: "Bob", Time: produceTime(), Text: "The weather is nice."}, {User: "Alice", Time: produceTime(), Text: "It's raining."}, }} var err error switch r.URL.Path { case "/posts/": err = t.Execute(w, data) case "/posts/more": err = t.ExecuteTemplate(w, "batch", data) } if err != nil { log.Printf("Template execution error: %v", err) }}produceTime()只会产生单调递增的时间戳字符串,因此输出看起来很有意义。
以及
main()注册处理程序并启动服务器的功能:
func main() { http.HandleFunc("/posts/", postsHandler) panic(http.ListenAndServe(":8080", nil))}就是这样。这是一个正在运行的应用程序。输入
http://localhost:8080/posts/浏览器,您将看到:
帖子
09:42:29 Bob: 天气很好。
09:42:30爱丽丝: 下雨了。Load more
按下
Load more按钮,浏览器中的内容将被动态刷新,而无需重新加载页面。新内容:
帖子
09:42:29 Bob: 天气很好。
09:42:30爱丽丝: 下雨了。
09:42:31鲍勃: 天气很好。
09:42:32爱丽丝: 下雨了。Load more
再次按下:
帖子
09:42:29 Bob: 天气很好。
09:42:30爱丽丝: 下雨了。
09:42:31鲍勃: 天气很好。
09:42:32爱丽丝: 下雨了。
09:42:33鲍勃: 天气很好。
09:42:34爱丽丝: 下雨了。Load more



