英文:
Golang pagination
问题
我需要实现分页功能。实际上,我有一个pages
数组,一个page
参数和一个per_page
变量。
在我的代码中:
pages_count := math.Floor(float64(len(pages)) / float64(per_page))
然后在模板中,我需要像这样的东西(伪代码):
{{ if .page - 2 > 0 }}
{{ $start_page := .page - 2 }}
{{ else }}
{{ $start_page := 1 }}
{{ end }}
{{ if .page + 2 >= .pages_count }}
{{ $finish_page := .page + 2 }}
{{ else }}
{{ $finish_page := .pages_count }}
{{ end }}
<ul>
{{ for $i := $start_page; $i <= $finish_page; ++$i }}
<li {{ if $i == .page }} class="current_page" {{ end }}>
<a href="{{ url "Pages.Show" .$i }}">{{$i}}</a>
</li>
{{ end }}
</ul>
如何正确实现这个功能?
谢谢。
英文:
I need to implement pagination. Actually I have pages
array, page
param and per_page
variable.
In my code:
pages_count := math.Floor(float64(len(pages)) / float64(per_page))
then in template I need something like (pseudocode):
{{ if .page - 2 > 0 }}
{{ $start_page := .page - 2 }}
{{ else }}
{{ $start_page := 1 }}
{{ end }}
{{ if .page + 2 >= .pages_count }}
{{ $finish_page := .page + 2 }}
{{ else }}
{{ $finish_page := .pages_count }}
{{ end }}
<ul>
{{ for $i := $start_page; $i <= $finish_page; ++$i }}
<li {{ if $i == .page }} class="current_page" {{ end }}>
<a href="{{ url "Pages.Show" .$i }}">$i</a>
</li>
{{ end }}
</ul>
How to implement this correctly?
Thx
答案1
得分: 3
当我使用Java模板(例如Velocity)时,我发现你所询问的模板逻辑会导致模板过于复杂。在Go语言中也是如此。
我的解决方案是将逻辑移到视图模型层,并保持模板的简单。这意味着控制器和视图模型需要做更多的预计算工作,以生成模板所显示的值。因此,视图模型会变得更大,但它只是简单的数据,易于进行单元测试。
在你的具体示例中,你可以保留构建<li>
列表的for循环。<ul>
标签之前的所有内容都可以在视图模型中处理。因此,模板只需使用一些预计算的数据即可正常工作。
英文:
When I work with Java templates (e.g. Velocity), I find that the kinds of template logic you are asking about lead to over-complex templates. The same applied in Go.
My solution is to move logic into the view-model layer and keep the templates rather dumb. This means that the controller and view model have to do a bit more work precomputing the kinds of values that your template shows. The view model is consequently larger - but it's just simple data and is easy to unit-test.
In your specific example, you would keep the for-loop that builds up the <li>
list. Everything above the <ul>
open tag can be handled in the view model. So the template would just work with some precomputed data.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论