在我的Struts2应用程序中,我有一个动态填充数据的表,来自数据库(通过Eclipselink JPA)。在该表下方有一个按钮,只要在表(jQuery)中选择了一行就会启用该按钮。现在,当单击该按钮时,我需要知道当前选择了哪一行,因此我可以访问相应的对象bean,因为我需要将bean ID(target_id
)传递到下一页({{1行动)。简而言之,问题是:如何访问所选(单击)表行中包含的Struts2对象bean?
1。屏幕截图:
Before row selection - > After row selection
2。 JSP代码:
createexperiment2
[...]
<table id="targets" class="ink-table grey tableSection">
<thead>
<tr>
<th colspan="5" class="align-left">Select your target:</th>
</tr>
</thead>
<tbody>
<s:if test="targets.size > 0">
<s:iterator value="targets">
<tr id="row_<s:property value="i"/>">
<td class="all-100"><a href="<s:url action="showtarget"><s:param name="id"><s:property value="target_id"/></s:param></s:url>"><s:property value="name"/></a></td>
<td class="all-15"><a href="<s:url action="edittarget"><s:param name="id"><s:property value="target_id"/></s:param></s:url>">edit</a></td>
<td class="all-5">|</td>
<td class="all-15"><a href="<s:url action="deletetarget"><s:param name="id"><s:property value="target_id"/></s:param></s:url>">delete</a></td>
<td class="all-5"><a href="help.jsp">?</a></td>
</tr>
</s:iterator>
</s:if>
</tbody>
</table>
第3。 jQuery代码:
<a href="createexperiment2" class="ink-button double-vertical-space all-25 buttonSection" id="next" disabled>Next ></a>
编辑1:
在Andrea的帮助下,我终于能够使用jQuery访问Struts2函数了,问题是我只能访问表中最后一个bean的属性(当JSP被访问时最后一个bean的属性)渲染,这是有道理的)。请参阅下面的更新代码,我将尝试解决此问题:
JSP:
$(document).ready(function(){
$('.tableSection tbody tr').click(function()
{
var selected = $(this).hasClass("highlight");
$('.tableSection tbody tr').removeClass("highlight");
$('.buttonSection').attr("disabled", false);
if(!selected)
$(this).addClass("highlight");
});
});
[...]
<s:if test="targets.size > 0">
<s:iterator value="targets">
<tr onclick="<s:set var="tid" value="target_id"/>">
[...]
</tr>
</s:iterator>
</s:if>
编辑2:
现在我知道单击了哪个表行索引,但是在尝试将其分配给变量(使用Struts标记)并将其发送到操作后数小时,我仍然没有得到我想要的内容。我甚至无法将此行索引发送到Action。这令人沮丧。然而,这就是我如何知道选择了哪一行:
<script type="text/javascript">
$(function () {
$('.tableSection tbody tr').click(function(event) {
alert ('<s:property value="%{#tid}" />');
});
});
</script>
[...]
<tr onclick="getRow(this)">
编辑3:
这一次,我终于能够将行ID(字符串)发送到操作。唯一剩下的问题是该操作被调用两次,第一次调用click事件,另一个调用因为<script>
function getRow(x)
{
alert("Selected row: "+x.rowIndex);
//return x.rowIndex;
}
</script>
HTML元素的href
属性,重定向到所需的Struts2操作。除了明显不合理之外,这自然会使变量在第二次调用时变为null。你知道我怎么能将这两个a
动作的“调用”合并为一个?我尝试将AJAX调用中的createxperiment2
选项设置为false,但没有成功。
[首先,从表async
中删除了onclick
事件,因为我只需要知道按下“下一步”按钮时哪一行突出显示。代码目前是这样的:
tr
答案 0 :(得分:1)
问:我已为每个表格行分配了一个ID。我怎么知道哪一个是被选中的?
使用this
关键字获取对象的ID:
$('.tableSection tbody tr').click(function(event) {
alert (this.id);
...
问:如何使用选定的表行ID访问相应的bean对象(在行本身中表示)?
目前尚不清楚:只需提交您的id
并检索对象服务器端,无论是通过AJAX还是标准表单提交。
答案 1 :(得分:0)
最后,解决方案:
首先获取对象的ID(我用Struts创建)。然后,在AJAX调用的帮助下,将ID发送到所需的操作(url:
属性)。成功完成此操作后,使用success:
回调选项定义您要重定向的位置。
Struts / JSP:
<s:if test="targets.size > 0">
<s:iterator value="targets">
<tr id="<s:property value="target_id"/>" class="highlight">
[...]
</tr>
</s:iterator>
</s:if>
<强> jQuery的:强>
<script type="text/javascript">
$('#next').click(function(event)
{
var tid = $('.highlight').attr("id");
$.ajax({
method: "POST",
url: "createexperiment2.action",
data: { tid : tid },
success:
function()
{
//alert("TID -> "+tid);
window.location = "loadworkloads.action";
}
});
});
</script>