我正在开发一个带有java play的网络应用程序!框架,在特定视图中我使用DataTable显示客户列表,我需要将名称列作为链接,点击它应该显示客户表。
我的问题是这个片段:
"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
$('td:eq(0)', nRow).html(
'<a href="@routes.Dashboard.dettagliCliente("'+aData[3]+'")">'+aData[0] + '</a>');
return nRow;
}
当应用程序运行时,我点击给定的客户,视图到达控制器但它没有将aData [3]的值传递给方法,而是直接传递字符串“aData [3]”
这是具体路线:
GET /dashboard/dettagli_cliente/:idCliente controllers.Dashboard.dettagliCliente(idCliente:String)
这是控制器:
public static Result dettagliCliente(String id){
Logger.info("CUSTOMER ID "+id);
final Cliente cliente = Cliente.findById(id);
Form<Cliente> formCliente = Form.form(Cliente.class).bindFromRequest();
Form<Cliente> filledForm = formCliente.fill(cliente);
return ok(registra_utente_form.render(User.findByEmail(request().username()),filledForm,cliente));
}
更新: 这是对视图的完整dataTable调用:
$(document).ready(function() {
$('#clienti_table').DataTable( {
"processing": true,
"serverSide": true,
"ajax": "@routes.Dashboard.testList()",
"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
$('td:eq(0)', nRow).html('<a href="@routes.Dashboard.dettagliCliente("'+aData[3]+'")">'+aData[0] + '</a>');
return nRow;
},
});
});
如果我在href属性中写了一个样本客户ID而不是aData[3]
,那么它可以工作:点击其中一个客户列表元素后,它会打开该给定客户的详细信息(id)
这是一个例子:
$(document).ready(function() {
$('#clienti_table').DataTable( {
"processing": true,
"serverSide": true,
"ajax": "@routes.Dashboard.testList()",
"fnRowCallback": function( nRow, aData, iDisplayIndex ) {
$('td:eq(0)', nRow).html('<a href="@routes.Dashboard.dettagliCliente("c0ed22dc-6c92-4a70-ad30-ea73e8b0c314")">'+aData[0] + '</a>');
return nRow;
},
});
});
谢谢大家
答案 0 :(得分:0)
它不能像这样工作,因为Play的路线在到达客户端之前很久就被渲染了......
要正确处理它,您需要使用other answer和/或the docs中所述的JavaScript路由,或者只是将正确的URL创建为字符串
var url = '<a href="/dashboard/dettagli_cliente/'+aData[3]+'">'+aData[0]+'</a>';
更多细节:
@routes
总是在视图渲染过程中渲染,这意味着在服务器端,所以远程机器格式化模板并感知它,JavaScript是客户端 - 您的浏览器。
如果在渲染视图期间没有给出参数,则会使用空值进行渲染。服务器对您的客户端脚本一无所知:它不会从您的浏览器窗口中读取任何内容。
它可以与普通纸报相比,当它在印刷厂印刷时,它只有他们现在知道的这些数据,如果你要买报纸并带到家里,你当然可以拿一支铅笔并更换一些文字,但是印刷厂不可能远程改变它......
最后一个好消息是,我在开始时给你的上述解决方案允许你解决问题,只是提到 JavaScript路径技术准备你的“ JavaScript版本”路线,所以你也可以在客户端准备有效的链接......
答案 1 :(得分:0)
在这种情况下,您需要使用Javascript Routing
在调用任何document.ready
js函数之前首先编译scala模板,并在最终生成的视图中生成一个url来代替@routes.Dashboard.dettagliCliente()
,以便在使用@routes.Dashboard.dettagliCliente()
时放入参数中的任何内容将被视为原样。因此在
案例1 :用于传递javascript变量
@routes.Dashboard.dettagliCliente("'+aData[3]+'")
生成网址
/dashboard/dettagli_cliente/'+aData[3]+'
案例2 :直接传递变量
@routes.Dashboard.dettagliCliente("data")
生成网址
/dashboard/dettagli_cliente/data
所以在你的情况2中,生成的url是正确的,所以它有效。
并且您可以使用直接链接/dashboard/dettagli_cliente/data
代替@routes...
,以便直接生成链接而无需任何转化。
同时检查Similar