10

我想让 Kaminari 使用分页控件以固定计数显示分页链接,例如每个导航页面上有 10 个链接。Kaminari 默认在第一页显示 6 个页面链接,当您继续浏览时,页面链接会继续增长,直到达到 9 个项目。

我在这里显示图片,当我第一次加载时,它总共有 5 个链接。

在此处输入图像描述

当我继续浏览时,它会增长。

在此处输入图像描述

在您浏览第 5 个链接之前,它只显示总共 9 个链接。

在此处输入图像描述

即使在 Kaminari 导航的开始或结束时,我如何始终保持 10 的链接计数。我尝试过 Kaminari config.window,但这不是我想要的。

4

3 回答 3

10

你可以修补 KaminariPaginatorPageProxy课程。通过覆盖relevant_pages, inside_window?, left_outer?, 等方法,right_outer?您可以控制页面链接何时显示在分页视图助手中。

首先,在config/initializers调用中创建一个新文件kaminari.rb并粘贴以下代码:

module Kaminari
  module Helpers
    class Paginator < Tag
      def relevant_pages(options)
        1..options[:total_pages]
      end

      class PageProxy
        def inside_window?
          if @options[:current_page] <= @options[:window]
            @page <= (@options[:window] * 2) + 1
          elsif (@options[:total_pages] - @options[:current_page].number) < @options[:window]
            @page >= (@options[:total_pages] - (@options[:window] * 2))
          else
            (@options[:current_page] - @page).abs <= @options[:window]
          end
        end
      end
    end
  end
end

它不漂亮,但它完成了工作。如果您window: 5在视图中设置,那么这将始终显示总共 10 个链接以及<span>当前页面的另一个链接。

要了解更多信息,请查看源代码https://github.com/amatsuda/kaminari/blob/master/lib/kaminari/helpers/paginator.rb

于 2013-04-05T21:25:47.667 回答
2

我无法得到上面的答案。我所做的是计算窗口大小并将其传递给我的分页部分。

控制器

  window = @items.current_page < 5 ? 5 - @items.current_page : 1
  render partial: 'pagination; locals: {items: @items, window: window}

_pagination.html.slim

.col-lg-6.pull-right
  ...
  = paginate items, remote: true, window: window
  ...
于 2015-06-09T17:38:21.633 回答
1

对于使用自定义主题的人:

在视图中(超薄文件):

...other code...
- each_side = 4 # in case want to show 10 pages
= paginate items, left: each_side * 2 + 1, right: each_side * 2 + 1, theme: 'your-theme'

在 app/views/kaminari/your-theme/_paginator.html.slim 中:

ruby:
  each_side = 4 # in case want to show 10 pages
  if current_page - each_side < 1
    top_page = 1
    bottom_page = top_page + each_side * 2 + 1 > total_pages ? total_pages : top_page + each_side * 2 + 1
  elsif current_page + each_side + 1 > total_pages
    bottom_page = total_pages
    top_page = bottom_page - each_side * 2 - 1 < 1 ? 1 : bottom_page - each_side * 2 - 1
  else
    top_page = current_page - each_side
    bottom_page = current_page + each_side + 1
  end

= paginator.render do
  nav.pagination
    ul.pagination-list
      # for rendering first_page link
      # == first_page_tag unless current_page.first?
      == prev_page_tag unless current_page.first?
      - each_page do |page|
        - if page <= bottom_page && page >= top_page
          == page_tag page
      == next_page_tag unless current_page.last?
      # for rendering last_page link
      # == last_page_tag unless current_page.last?
于 2018-12-06T04:34:00.637 回答