在XPage / JSF中删除带有确认消息客户端的DataTable行

时间:2017-01-05 03:04:44

标签: jsf datatable xpages actionlistener

我正在使用记录的数据表。我想让用户能够删除和编辑内联行(带有垃圾和编辑图标的列)。当用户想要删除时,我需要客户端自定义确认。如果他们单击是,我想提交到服务器并删除该行。

我这样做没有这样的确认,因为我在<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.");
}

3 个答案:

答案 0 :(得分:1)

我这种事情的典型方法 - 重复按钮,启动对话框,然后在关闭对话框时在行服务器端执行 - 是在viewScope变量中存储对重复元素的引用。将其传递给xp:inputHidden也可以通过CSJS完成,因此请避免使用SSJS启动对话框。

答案 1 :(得分:0)

使用简单return confirm("Are you sure?");定义该删除事件的客户端脚本仅当用户单击是时才会执行SSJS脚本。

答案 2 :(得分:0)

解决方案在我的评论中。单击行编辑图标时需要设置rowIndex。在我的情况下,我使用提交的值变量。正如Paul Stephans Withers所说,你可以使用其中一个Scoped变量。在所有情况下,将rowIndex保存在其中一个应用程序映射变量中,当对话框执行时,您需要使用此变量值。