【问题标题】:Deleting a DataTable row with confirmation message client side in XPages/JSF在 XPages/JSF 中删除带有确认消息客户端的 DataTable 行
【发布时间】:2024-04-13 20:35:01
【问题描述】:

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

我没有这样的确认就可以工作,因为我在<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}" 正在应用每个行索引。

效果很好。

现在我需要介绍一条自定义确认消息。

所以我用&lt;a /&gt; 替换了这个按钮来启动删除对话框......并将已经工作的删除按钮移到对话框中。现在的问题是我丢失了"#{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.");
}

【问题讨论】:

  • 我不确定这是否回答了我关于提交值可用性的问题,但我有一个解决方法。将负责显示自定义确认对话框的数据行中的 标签转换为组件标签 并设置提交的值 onclick XSP.setSubmitValue(#{rowIndex});.... 删除setSubmittedValue javascript 从对话框按钮 eventHandlers 并允许 actionListener 提交。动作监听器的参数是 value="#{javascript:context.getSubmittedValue();}"。该值将在 actionListener 的 params 映射中。
  • @Peter Mortensen,感谢您的编辑。

标签: jsf datatable xpages actionlistener


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我无法使用浏览器的确认功能。我必须使用自定义对话框。
    【解决方案3】:

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

    【讨论】:

      最近更新 更多