在 DataTables 表加载 Ruby on Rails 时显示微调器

Posted

技术标签:

【中文标题】在 DataTables 表加载 Ruby on Rails 时显示微调器【英文标题】:Display spinner while DataTables table loads Ruby on Rails 【发布时间】:2015-11-05 08:35:45 【问题描述】:

我使用 Rails 构建了一个网络应用程序。 Web 应用程序的一个页面显示一个使用DataTables API 的表格。这个JSFiddle 展示了我的网络应用程序的示例。

这样做的问题是,当我开始添加大量数据(当前测试数据为 1500 行)时,该表会在运行 javascript 之前先加载每一行,这意味着在Javascript 启动并激活 DataTables。

我想在表格完全填充之前显示一个微调器或处理消息(类似这些行的东西),一旦完成,我想运行我的 javascript 激活 DataTables。

编辑:我的主要问题是我不确定如何在表格加载时使用 Javascript 显示微调器,但在页面加载完成后更改为表格

我的代码如下:

html/eRB

<div class="list">
    <div class="container">
        <div class="row">
            <div class="col-md-12">
                <table id="app-list-table" class="display table" cellspacing="0">
                    <thead>
                        <tr class="table-headers">
                            <th>Header 1</th>
                            <th>Header 2</th>
                            <th>Header 3</th>
                            <th>Header 4</th>
                            <th>Header 5</th>
                            <th>Header 6</th>
                            <th>Header 7</th>
                            <th>Header 8</th>
                            <th>Header 9</th>
                            <th>Header 10</th>
                        </tr>
                    </thead>
                    <tbody>
                        <%= Server.find_each do |server| %>
                        <tr>
                            <td><%= link_to(server.server_name, server_path(server)) %></td>
                            <td><%= server.application %></td>
                            <td><%= server.server_role %></td>
                            <td><%= server.team_contact %></td>
                            <td><%= server.individual_contact %></td>
                            <td><%= server.business_owner %></td>
                            <td><%= server.vendor %></td>
                            <td><%= server.vendor_contact %></td>
                            <td><%= link_to("Click Here", server.main_doc) %></td>
                            <td><%= server.main_win %></td>
                        </tr>
                        <% end %>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>

Javascript

$(document).ready(function() 
        var table = $('#app-list-table').DataTable(
            "scrollX": true

        );
    );

如果您还希望我提供任何其他内容,请告诉我。

【问题讨论】:

Spin.js 是微调器本身的一个选项。其他一切都取决于您希望它看起来像什么...... 微调器和它的设计并不重要。我的问题是我不知道在哪里添加 js 代码以在页面加载时显示微调器,然后在完全加载后显示表格......抱歉,我的问题不够清楚跨度> 不幸的是,我自己有点业余。但我不认为这是 DataTables 问题......当我的页面加载时,它会在激活 DataTables 之前填充整个 HTML 部分,这会留下未格式化的表格。我认为 DataTables 正在等待 IT。不是相反 ETA:数据是如何加载的?是异步的吗?要在加载时显示微调器,您希望在数据之前加载微调器,然后在成功加载后将其移除 数据加载如问题所示。它使用嵌入式 ruby​​ 循环遍历每个对象并使用该对象作为参考填充列。我不确定java脚本和ruby是否异步运行。 【参考方案1】:

您可以添加一个微调器 gif(在此处查找:http://www.ajaxload.info/)作为 div 您的表格应该在哪里,然后在表格加载时使用 initComplete 清除它。

&lt;div class="col-md-12"&gt;下面放上类似的东西:

<img id="loadingSpinner" src="/myspinner.gif">

然后像这样调用你的表:

$(document).ready(function() 
  var table = $('#app-list-table').DataTable(
    //any other datatables settings here
    "initComplete": function(settings, json) 
      $('#loadingSpinner').hide();
      //or $('#loadingSpinner').empty();
    
  )
);

【讨论】:

表格加载后隐藏微调器非常有效!谢谢你。另一件事是从页面加载到 DataTables 初始化之前隐藏表格。页面首次加载时是否有 javascript 函数 ti 初始化代码? 不幸的是,据我所知,您不能这样做。如果数据表找不到表的 div,您将收到错误并且不会加载。这包括 div 是否隐藏或事后添加。 我明白了。。谢谢你的帮助。 谢谢。我将尝试以其他方式隐藏 div,但您的微调器实现有所帮助【参考方案2】:

如果数据是在 Ruby 中加载的,那么加载微调器是没有意义的,因为那时数据已经加载了。这是 Rails 应用程序中发生的事情的基本顺序:

    控制器然后查看 Ruby 执行,呈现 HTML HTML 被发送到客户端 客户端请求按顺序链接 CSS 和 JS CSS 和 JS 依次执行 异步 JS 结束

因此,您的大部分延迟发生在第 1 步,但 CSS/JS 微调器要到第 4 步才会加载。如果您想使用微调器,则需要通过异步 Ajax 加载数据,因此您可以在 4 中加载 spinner,然后在 5 中完成加载数据并移除 spinner。使用 jQuery Ajax:

var spinner = new Spinner().spin(document.getElementById('spinner'));
$.ajax("/your/data/path.json")
.done(function(data) 
  // load data here, then load table:
  var table = $('#app-list-table').DataTable( … )
  // remove spinner
  $('#spinner').remove();
);

您当然可以将微调器添加到您当前的代码中:

var spinner = new Spinner().spin(document.getElementById('spinner'));
$('#app-list-table').DataTable( 
  …
  initComplete: function()  $('#spinner').remove(); 
)

但是,同样,由于大部分延迟发生在 Ruby 中,因此您只会在延迟结束时短暂看到微调器。要查看整个延迟的微调器,请使用 Ajax。

【讨论】:

抱歉,我不想使用 AJAX。谢谢你的回答【参考方案3】:

如果您正在寻找一种在数据表准备好之前隐藏数据表的方法,可以通过将数据表放入最初设置为 display:none 的 div 中,然后在初始化后显示该 div数据表...我还在整个页面上添加了一个不透明的覆盖 div,同时加载数据表并延迟 500 毫秒以强制加载效果。

<script type="text/javascript" language="javascript" >
$(document).ready(function () 

	$(function()
	   function loadDataTable()
		
			var dataTableId = $('#dataTableId').dataTable("initComplete": function(settings, json) $('.overlay').hide(););
			$('#divContatingDataTable').show();
	;
	   window.setTimeout(loadDataTable, 500);
	);

);
</script>
<style type="text/css">
	.overlay 
		background: #ffffff;
		position: absolute;
		top: 0;
		right: 0;
		bottom: 0;
		left: 0;
		width:100%;
		height:100%;
		text-align: center;
		opacity: 0.8;
	
</style>
<div class="overlay">
	This div / overlay contains a loading message / image and can be styled however you like
	<img class="loading" src="loading.gif" />
</div>


<div id="divContatingDataTable" style="display:none;">
	<!-- Datatable contents with id dataTableId go here -->
</div>

【讨论】:

【参考方案4】:

我使用了下面链接中提供的代码,但如果不使用旧的 jquery 版本,您应该使用最新的 (3.x),否则 Datatables 会崩溃。希望对您有所帮助

http://bradsknutson.com/blog/display-loading-image-while-page-loads/

【讨论】:

以上是关于在 DataTables 表加载 Ruby on Rails 时显示微调器的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails + best_in_place + 数据表 + haml

使用 find_by 加载 Ruby on Rails

Rails 4 + 数据表:数据表未正确加载

将更改事件绑定到每个 DataTables 行中的复选框

Ruby on Rails:“无法加载此类文件”事件机器

Ruby on Rails 控制台在加载时挂起