2015-06-25 3 views
1

Я работаю в приложении Rails и используя опцию deferLoading: true в jQuery DataTables, чтобы передать загрузку первых DataTables в контроллер Rails.Включить разбиение на страницы с deferLoading

У меня есть загрузка данных, как я этого хочу, загрузка начальной таблицы в контроллере избавляется от задержки Ajax, когда начальная загрузка html, однако раздел данных Datatable не отображает результаты разбивки на страницы.

Код и изображения показаны ниже.

Снова все работает, за исключением разбивки на страницы внизу таблицы, я просто не могу заставить его применять те же детали, что и Ajax, для вызова данных. Любые идеи или направления в этом вопросе будут очень признательны!

index.html.erb:

<div class="row"> 
    <div class="col-xs-12 table-wrapper"> 
    <div class="inner-wrapper"> 
     <p class="quick-app"> 
     <a class="custom-btn accent-inverse-btn add-user" href="<%= calculator_path%>">Quick Application</a> 
     </p> 
     <table class="table table-striped table-scroll cms-table-width dataTable" id="customer_deals_datatable" data-source="<%= dealer_customer_deals_url(:include_archived => params[:include_archived].present?) %>" > 
     <div> 
      <thead> 
      <tr> 
       <th>ID/Calculator</th> 
       <th>Applicant/Co-Applicant</th> 
       <th>Year</th> 
       <th>Model</th> 
       <th>App Status</th> 
       <th>Tier Number</th> 
       <th>Docs Status</th> 
       <th>Submitted On</th> 
       <th>Days Remaining</th> 
       <th>Chrome Decision</th> 
       <th>Updated At</th> 
       <th>Actions</th> 
      </tr> 
      </thead> 
      <tbody> 
      <% @datatable.data.each do |datum| %> 
      <tr> 
       <% datum[0] = datum[0].join('') %> 
       <%= (datum.map {|content| "<td>#{content}</td>"}.join('')).html_safe %> 
      </tr> 
      <% end %> 
      </tbody> 
     </div> 
     </table> 
    </div> 
    </div> <!-- </div>#content --> 
</div> 

controller

def index 
    respond_to do |format| 
    format.html do 
     params.merge!({"iDisplayLength"=>"10","iSortCol_0"=>"10","sSortDir_0"=>"desc"}) 
     @datatable = CustomerDeals::CustomerDealsDataTable.new(view_context, @dealer) 
    end 
    format.json { render json: CustomerDeals::CustomerDealsDataTable.new(view_context, @dealer) } 
    end 
end 

вот часть кода из DataTable класса в проекте:

module CustomerDeals 
    class CustomerDealsDataTable 

    def fetch_deal_searches 
     return @deal_searches if @deal_searches.present? 

     deal_searches = CustomerDeals::CustomerDealSearch.where(dealership_id: @dealer) 

     if is_submitted_on_sort? 
     deal_searches = deal_searches.where('deal_dated_calculator_value != ?', 'calculator') 
     end 
     if params[:sSearch].present? 
     deal_searches = deal_searches.containing(params[:sSearch]) 
     end 
     deal_searches = deal_searches.order(order_query) 

     @deal_searches = deal_searches 
    end 

    def is_submitted_on_sort? 
     SORT_COLUMNS[params[:iSortCol_0].to_i] == 'deal_submitted_on' 
    end 

    def lookup_sort_column 
     SORT_COLUMNS[params[:iSortCol_0].to_i] 
    end 

    def order_query 
     "#{lookup_sort_column} #{params[:sSortDir_0]}" 
    end 

    def paged_deal_searches 
     fetch_deal_searches.page(current_page_number).per(params[:iDisplayLength]) 
    end 

    def current_page_number 
     params[:iDisplayLength].to_i == 0 ? 1 : params[:iDisplayStart].to_i/params[:iDisplayLength].to_i + 1 
    end 
    end 
end 

with ajax datatable info pagination working rendering html datatable from controller, no pagination

ответ

1

Вы находитесь на правильном пути, deferLoading также может быть назначен целого или массивом из двух целых чисел указать, сколько записей есть в таблице пагинации работать.

От manual:

deferLoading используется для указания того, что требуется отложенная нагрузка, но она также используется, чтобы сказать DataTables, сколько записей есть в полной таблице (с учетом информационного элемента и разбиения на страницы для отображаться правильно).

В случае, когда фильтрация применяется к таблице при начальной загрузке, это можно указать, указав параметр как массив, где первым элементом является количество записей, доступных после фильтрации, а второй элемент - это число записей без фильтрации (что позволяет правильно отображать элемент информации таблицы).

Примеры:

57 записей, доступных в таблице, фильтрация не применяется:

$('#example').dataTable({ 
    "serverSide": true, 
    "ajax": "scripts/server_processing.php", 
    "deferLoading": 57 
}); 

57 записей После фильтрации 100 без фильтрации (начальный фильтр применяется):

$('#example').dataTable({ 
    "serverSide": true, 
    "ajax": "scripts/server_processing.php", 
    "deferLoading": [ 57, 100 ], 
    "search": { 
    "search": "my_filter" 
    } 
}); 
+0

спасибо Gyrocode, мы добавили что-то вроде '' deferLoading ': $ (' # customer_deals_datatable '). Data ('length')] ', и это, казалось, исправило проблему. – heinztomato

Смежные вопросы