我有一对字段(BillingServicesDD和BillingServicesFF)。应该显示一个或另一个,具体取决于“ SpreadSheet”字段的值。在我的onClientLoad事件中,执行以下操作;

// Set up field hide-when on loading.
spreadSheetVis();
.
(other cool, but unrelated code)
.
}


我的spreadSheetVis()例程如下。

// set the visibility of our billingservices selection depending on what we
// selected in the spreadsheet value.
function spreadSheetVis() {

  var em = XSP.getElementById("#{id:editMode}");
  if ( em == undefined ) {
    var ss = XSP.getElementById("#{id:SpreadSheetDsp}").innerHTML;
    } else {
    var ss = XSP.getElementById("#{id:Spreadsheet}").value;
    };
  if ( ss === "Compliance") {
    XSP.getElementById("#{id:BillingServicesDD}").style.display = "inline";
    XSP.getElementById("#{id:BillingServicesFF}").style.display = "none";
    } else {
    XSP.getElementById("#{id:BillingServicesDD}").style.display = "none";
    XSP.getElementById("#{id:BillingServicesFF}").style.display = "inline";
    };
}


SpreadSheet和BillingServicesDD都是组合框。 SpreadSheetDSP和BillingServicesFF都是inputTexts。 SpreadSheet和SpreadSheetDSP都指向FInvoiceDoc.Spreadsheet。我使用此方法而不是可见/渲染方法,因为我需要表单上的所有这些值可用于表单的其他部分。我只是不想显示选定的对象,甚至不希望看到他们时就占用房地产。

在大多数情况下,这非常有效。我的问题是,保存表单时如果出现某种验证错误,那么BillingServicesDD和FF都将显示。如果表单上的错误消息字段由我编写的服务器端验证例程设置,则稍后将在带有警告语句的onClientLoad事件中发生验证错误消息。

在onClientLoad事件和警报消息中,该字段显示始终是正确的(这是onClientLoad事件中发生的最后一件事情)。此后的某个时候,似乎再次显示该文档时,两个字段都出现了。 (顺便说一句,此重新显示似乎不再通过onClientLoad事件进行。)

由于这都是客户端代码,因此我将通过IE的调试器运行它。那里发生了一些奇怪的事情。所有代码都按预期运行,但是当我逐步执行所有步骤(甚至遍历所有bizzar不是我的代码的东西)时,它说我需要重新提交文档,然后陷入循环中,不断获取我的文档警报错误消息。那我要杀了IE。

如果我关闭了调试器,则不会发生此循环。

最佳答案

您需要更改方法。删除试图隐藏OnLoad事件中的字段的代码。
我假设您没有使用rendered属性(首先不会发送该字段),因为在某些计算中您需要它。

转到该字段的所有属性面板,找到样式属性,然后输入一个计算可见性或显示属性的SSJS表达式。

将计算结果放在那里,将不会有任何刷新。

一个样品:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:checkBox text="Control on" id="editMode"
        value="#{viewScope.editMode}" checkedValue="true"
        uncheckedValue="false" defaultChecked="true">
        <xp:eventHandler event="onclick" submit="true"
            refreshMode="partial" refreshId="SpreadSheetDsp">
        </xp:eventHandler>
    </xp:checkBox>

    <xp:table style="width:100.0%" id="SpreadSheetDsp">
        <xp:tr style="background-color : #FFBBBB">
            <xp:this.rendered><![CDATA[#{javascript:"false" != viewScope.editMode;}]]></xp:this.rendered>
            <xp:td>Visible</xp:td>
            <xp:td>when checked</xp:td>
        </xp:tr>
        <xp:tr style="background-color : #BBBBFF">
        <xp:this.rendered><![CDATA[#{javascript:"false" == viewScope.editMode;}]]></xp:this.rendered>
            <xp:td>Visible</xp:td>
            <xp:td>when unchecked</xp:td>
        </xp:tr>
    </xp:table>
</xp:view>


希望能有所帮助

09-25 19:59