selectBooleanCheckbox 中 javascript 函数的损坏参数

Damaged parameter of javascript function in selectBooleanCheckbox

我们有 table,每行有 h:selectBooleanCheckbox(复选框代表 boolean)。我们想在更改复选框值(在任何行中)时调用支持 bean 操作。

以下代码以有趣的方式工作:如果 ID 号(第 1 列的参数 - String - 用作 javascript 的参数)很短(10 个字符),则 javascript 参数是正确的,如果 ID 号更长(18 个字符)则 javascript 参数不是 - 值被部分破坏(前 16 个字符是正确的,17 和 18 个字符被 0 替换)。

XHTML:

    <rich:dataTable id="loyaltyIdTable"
        rows="#{referenceData.recordsPerPage}"
        rowClasses="oddrow, evenrow"
        var="pi"
        value="#{chProfile.loyaltyPIs}">

        <rich:column>
            <f:facet name="header">
                <h:outputText value="ID Number" />
            </f:facet>
            <h:outputText value="#{pi.idNumber}" />
        </rich:column>

        <rich:column styleClass="centeralign">
            <f:facet name="header">
                <h:outputText value="Can Redeem" />
            </f:facet>
            <h:selectBooleanCheckbox value="#{pi.canRedeem}"
                onclick="alert(#{pi.idNumber});"
                onchange="alert('ID number: ' + #{pi.idNumber}); return false;" />
        </rich:column>

        <rich:column styleClass="centeralign">
            <f:facet name="header">
                <h:outputText value="Delete" />
            </f:facet>
            <a4j:commandLink execute="@this" render="deleteConfirmationPanel"
                oncomplete="#{rich:component('confirmPopup')}.show()">
                <h:graphicImage value="/images/delete.gif" style="border:none;" />
                <a4j:param value="#{pi.idNumber}" assignTo="#{loyaltyIdForm.deleteId}" />
            </a4j:commandLink>
        </rich:column>
    </rich:dataTable>

在这段代码中,我的 javascript 函数被普通的 alert 代替了。 从哪个属性 onclickonchange 调用 javascript 并不重要 - 结果是相同的:#{pi.idNumber} 的最后 2 个字符被替换为 0 时字符串长度为 18.

与使用 h:commandButton 删除行时的参数完全相同。用 a4j:param 替换 h:commandButtona4j:commandLink 后,这部分工作正常(参数正确)。以下是不正确的工作代码:

    <h:commandButton value="#{msg.delete}"
        action="#{chAction.deleteAltId(pi.idNumber)}"
        onclick="return confirm('#{msg.deleteAltId} #{pi.idNumber}?')"
        render="loyaltyIdTable" />

环境:JSF 2.1 和 RichFaces 4.3。 在此环境中,a4j:ajaxf:ajaxh:selectBooleanCheckbox 都没有 action 属性。这意味着应该调用 javascript。

有人可以向我解释如何在重复结构中使用参数(不同于复选框对象)正确调用 javascript(根据 onclickh:selectBooleanCheckbox 中的 onchange)( table 或列表的行)?

我可以通过添加命令按钮或用命令 link 替换 h:selectBooleanCheckbox 轻松解决这个问题(里面有 2 个图像 check/uncheck)。但我想知道 h:selectBooleanCheckbox.

是否有可行的解决方案

这里,

onclick="alert(#{pi.idNumber});"
onchange="alert('ID number: ' + #{pi.idNumber}); return false;"

您将其打印为 Java脚本数字类型变量。和Javaint一样,它也有技术上的限制。对于 JavaScript,它是 253 (9007199254740992)

最好将其打印为字符串。

onclick="alert('#{pi.idNumber}');"
onchange="alert('ID number: #{pi.idNumber}'); return false;"

请注意,EL 在服务器端运行(同时生成 HTML/JS 输出),而不是在客户端运行,因此无需 "string-concatenate" 将其转换为 Java 脚本变量。