Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 如何使用新的url和一些参数重新加载datatable而不重新初始化它_Ajax_Datatables - Fatal编程技术网

Ajax 如何使用新的url和一些参数重新加载datatable而不重新初始化它

Ajax 如何使用新的url和一些参数重新加载datatable而不重新初始化它,ajax,datatables,Ajax,Datatables,我知道我可以使用ajax.url在datatable上发出ajax请求,如: 但如何使用相同的语法将数据作为参数传递给url? 我尝试table.ajax.url('mylink').data(myData.load()。显然,这不是解决办法 我不想为了使用以下内容而销毁和重新初始化datatable: ... "ajax" : { "url" : "mylink", "data" :

我知道我可以使用ajax.url在datatable上发出ajax请求,如:

但如何使用相同的语法将数据作为参数传递给url? 我尝试
table.ajax.url('mylink').data(myData.load()。显然,这不是解决办法

我不想为了使用以下内容而销毁和重新初始化datatable:

...
"ajax" : {
        "url" : "mylink",
        "data" : myData
 }
 ...
我该怎么办?使用现有初始化表(这里是JSVAR表)的语法是什么?
感谢您在DataTables
ajax
部分中使用的,您可以使用函数形式,而不是使用
data
选项的对象形式。这允许您为每个新的ajax调用动态地传递请求数据

因此,与此相反:

"data" : myData
这将是:

"data": function () {
  return myData;
}
而且,正如您已经注意到的,您可以使用
ajax.url()
调用来指定新的url:

table.ajax.url( 'newData.json' ).load();

警告:这假设您没有使用服务器端处理,因为这将覆盖由DataTables自动生成的服务器端请求数据。如果使用服务器端处理,则必须将自定义数据合并到预先存在的请求数据中

下面的示例使用jQuery
extend

"data": function ( d ) {
  return $.extend( {}, d, {
    "extra_search": $('#extra').val()
  } );
}
您不需要使用
$.extend
。您只需要注意不要覆盖Datatables生成的请求数据

另一种处理方法是简单地将数据附加到
“data”:function(d)
中由
d
表示的数据结构中:


使用更详细的示例更新

下面是一个完整的示例,如果您愿意,您可以将其复制到html文件中并自行运行。它使用来自虚拟JSON提供程序的数据,仅用于测试

HTML,显示表格和按钮。该按钮是我如何测试调用新URL并将新请求参数传递给该新URL的能力的:

<div style="margin: 20px;">
    <button id="button_one" type="button">Resubmit</button>
    <br><br>
    <table id="example" class="display" style="width:100%"></table>
</div>
为了进行测试,我使用以下JavaScript将表单内容捕获到数组中:

var form_data = [];

$( "#filter-form" ).submit(function( event ) {
  event.preventDefault();
  form_data = $( this ).serializeArray();
  table.ajax.url( url ).load();
});
最终结果是
form_data
变量中的如下数据:

[
  {
    "name": "city",
    "value": "Berlin"
  },
  {
    "name": "country",
    "value": "Germany"
  }
]
现在,我可以将该数据合并到自动创建的服务器端请求数据中。在这里,我可以选择使用上面提到的
$.extend()
函数:

  $('#example').DataTable( {
    serverSide: true,
    ajax: { 
      method: "POST",
      url: url, // from a variable
      data: function( d ) {
        return $.extend( {}, d, { "my_extra_data": form_data } );
      }
    },
    ... //whatever else is in your DataTable definition...
  });
此函数产生如下请求数据:

{
    "draw": "2",
    "columns[0][data]": "id",
    "columns[0][name]": "",
      ...
    "start": "0",
    "length": "10",
    "search[value]": "",
    "search[regex]": "false",
    "my_extra_data[0][name]": "city",
    "my_extra_data[0][value]": "Berlin",
    "my_extra_data[1][name]": "country",
    "my_extra_data[1][value]": "Germany"
}
您可以看到您的
my\u extra\u数据
值与服务器端自动生成的请求数据一起包含。所有这些都会作为请求的一部分发送到服务器

如果您使用的是
POST
,则它位于请求正文中

如果您使用的是
GET
,则它是相同的数据-但作为查询字符串添加到URL中

在这两种情况下,它都转换为表单数据使用的标准字符串表示形式

然后由服务器端代码以通常的方式访问这些数据

注意:您可能希望提供URL编码的表单数据,如下所示:

...&city=Berlin&country=Germany
而是以名称/值对数组的形式提供:

&my_extra_data%5B0%5D%5Bvalue%5D=Berlin&my_extra_data%5B1%5D%5Bname%5D=country&my_extra_data%5B1%5D%5Bvalue%5D=Germany
因此,需要额外的服务器端工作来解析这些数据

如果要将表单数据直接转换为JavaScript对象,如下所示:

{ "city": "Berlin", "country", "Germany" }
然后看看这个问题的答案:


我想使用table.ajax.url('newData.json').load();带有url和参数(我必须传递的数据)。恐怕你目前的回答对我没有帮助,或者我不理解你的解决方案。我提供了一个更详细的例子,说明了方法。让我知道这是否澄清了我的答案。当然,如果我误解了你的意图,请告诉我。谢谢@andrewjames的解释。在我的例子中,它是从服务器端加载的,当我应用table.ajax.url('myurl'+“?filter\u author=“+filter\u author).load()时,它可以工作。第一次初始化仅使用url“myurl”。但问题是我需要发送更多的参数。这些都是表格。因此,使用&and?将每个参数添加到url会很痛苦?。这就是为什么我要求一个简单的方法来做这件事。你能澄清一下“它是从服务器端加载的”是什么意思吗?这是否意味着您的数据表正在使用
serverSide:true
?或者它意味着什么?(您不需要使用
&
构建字符串-您可以使用我提供的方法-但是如果您使用表单,则需要对表单中的数据和服务器端的
进行一些更改)。是的,我的意思是服务器端:true。`但是对表单中的数据进行一些更改,对于服务器端`我需要对表单数据做哪些更改?当我检查您的解决方案时,单击按钮时的ajax请求没有提交数据。
...&city=Berlin&country=Germany
&my_extra_data%5B0%5D%5Bvalue%5D=Berlin&my_extra_data%5B1%5D%5Bname%5D=country&my_extra_data%5B1%5D%5Bvalue%5D=Germany
{ "city": "Berlin", "country", "Germany" }