我正在使用记录的数据表。我想让用户能够删除和编辑内联行(带有垃圾和编辑图标的列)。当用户想要删除时,我需要客户端自定义确认。如果他们单击是,我想提交到服务器并删除该行。
我这样做没有这样的确认,因为我在<datatable />
:
<xp:button styleClass="btn red"
value="Delete"
id="btnConfirmDelete">
<xp:eventHandler event="onclick"
submit="true"
refreshMode="partial"
refreshId="dataTable"
disableValidators="true">
<xp:this.parameters>
<xp:parameter name="rowIndex"
value="#{rowIndex}">
</xp:parameter>
</xp:this.parameters>
<xp:this.actionListeners>
<xp:actionListener type="com.domain.thing.listeners.deleteItemListener">
</xp:actionListener>
</xp:this.actionListeners>
</xp:eventHandler>
</xp:button>
此按钮位于重复面板中。每个行索引由EL "#{rowIndex}"
应用。
效果很好。
现在我需要引入自定义确认消息。
所以我用<a />
替换了这个按钮以启动删除对话框...并将删除按钮移动到对话框中。现在的问题是,我丢失了"#{rowIndex}"
。相反,我使用自定义属性将值设置为DOM。
我遇到的问题是通过参数在侦听器com.domain.thing.listeners.deleteItemListener中检索此值。
我调整了这样的代码:
<xp:eventHandler event="onclick"
submit="true"
refreshMode="partial"
refreshId="demurrageDataTable"
onStart="XSP.setSubmitValue(window.dataTableRowDelete); alert('row is ' + XSP.getSubmitValue());"
onError="alert('onError: There was an error with the request.');"
disableValidators="true">
<xp:this.parameters>
<xp:parameter name="rowIndex"
value="#javascript:context.getSubmittedValue();}">
</xp:parameter>
</xp:this.parameters>
<xp:this.actionListeners>
<xp:actionListener type="com.canalbarge.trak.listeners.deleteDemurrageItemListener">
</xp:actionListener>
</xp:this.actionListeners>
</xp:eventHandler>
onStart我得到了由对话框启动设置的rowIndex。 当警报触发时,会显示正确的rowIndex。
事件侦听器中的服务器端有一个异常,因为p.getValue()始终是一个空字符串“”。
XspEventHandler eventHandler = (XspEventHandler) event.getSource();
List<Parameter> params = eventHandler.getParameters();
System.out.println(btnName + "checking event params");
if(params != null){
for (Parameter p : params) {
System.out.println(btnName + p.getName() + "," + p.getValue());
if(p.getName().equals("rowIndex")){
rowIndex = Integer.parseInt(p.getValue());
}
}
}
else{
System.out.println(btnName + "params is null.");
}
答案 0 :(得分:1)
我这种事情的典型方法 - 重复按钮,启动对话框,然后在关闭对话框时在行服务器端执行 - 是在viewScope变量中存储对重复元素的引用。将其传递给xp:inputHidden
也可以通过CSJS完成,因此请避免使用SSJS启动对话框。
答案 1 :(得分:0)
使用简单return confirm("Are you sure?");
定义该删除事件的客户端脚本仅当用户单击是时才会执行SSJS脚本。
答案 2 :(得分:0)
解决方案在我的评论中。单击行编辑图标时需要设置rowIndex。在我的情况下,我使用提交的值变量。正如Paul Stephans Withers所说,你可以使用其中一个Scoped变量。在所有情况下,将rowIndex保存在其中一个应用程序映射变量中,当对话框执行时,您需要使用此变量值。