在初始化代码中使用oSearch变量,我可以为搜索字段定义一个初始化值,即 isearch 变量:
$(document).ready( function() {
var isearch = $('#isearch').val()
$('#example').dataTable( {
"oSearch": {"sSearch": isearch}
} );
} )
isearch 值存储在视图中适当的隐藏字段中:
<%= hidden_field_tag "isearch", @isearch.to_s, { :id => "isearch" } %>
(这是迄今为止我发现的将实例变量传递给 Rails 中的 .js 文件的最佳方法)。
最后但同样重要的是,@isearch 实例变量是从 order_controller 设置的:
@isearch = params[:isearch]
当然,它的值应该像这样传递给 url:
.../orders?isearch='customer_name+customer_surname'
- - 附录 - -
我发现我不需要实例变量,实际上我可以使用这个 javascript 函数传递任意数量的 url 参数:
function getUrlParam( name )
{
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp( regexS );
var results = regex.exec( window.location.href );
if( results == null )
return "";
else
return results[1].replace("+", " ");
}
然后我可以像这样从我的 .js 文件中获取它们:
// fetches url params
var isearch = getUrlParam('isearch');
var customer_name = getUrlParam('customer_name');
var order_status = getUrlParam('order_status');
根据这些值,我不仅可以设置 oSearch 变量,还可以使用 Datatables aoSearchCols初始化参数(http://www.datatables.net/ref#aoSearchCols)设置特定列
最后一个要解决的问题,鉴于我正在使用带有选择元素的单个列过滤(http://www.datatables.net/release-datatables/examples/api/multi_filter_select.html),因此根据 URL 设置每个选择元素-通过的参数。我用这个 jQuery 指令做到了:
// sets all select filters according to url passed params
$('select').val([customer_name, preparation_kind, preparation_status]);
从性能的角度来看,这个解决方案是可以改进的,但是它很简单而且很有效。