Golang 分页

huangapple go评论82阅读模式
英文:

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 &lt;= $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 &gt; 0 }}
    {{ $start_page := .page - 2 }}
{{ else }}
    {{ $start_page := 1 }}
{{ end }}

{{ if .page + 2 &gt;= .pages_count }}
    {{ $finish_page := .page + 2 }}
{{ else }}
    {{ $finish_page := .pages_count }}
{{ end }}

&lt;ul&gt;
    {{ for $i := $start_page; $i &lt;= $finish_page; ++$i }}
        &lt;li {{ if $i == .page }} class=&quot;current_page&quot; {{ end }}&gt;
            &lt;a href=&quot;{{ url &quot;Pages.Show&quot; .$i }}&quot;&gt;$i&lt;/a&gt;
        &lt;/li&gt;
    {{ end }}
&lt;/ul&gt;

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 &lt;li&gt; list. Everything above the &lt;ul&gt; open tag can be handled in the view model. So the template would just work with some precomputed data.

huangapple
  • 本文由 发表于 2014年7月19日 17:53:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/24839028.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定