Xpage .component.setValue(' Some Value')适用于某些xpage而非其他xpage

时间:2014-04-22 15:56:33

标签: xpages xpages-extlib xpages-ssjs

我在复选框的点击事件中设置输入字段的值。可编辑字段用于验证复选框组。此代码在一个xpage中工作。当我尝试在其他xpage中复制此代码时,它无效。

这是一个有效的代码:

    <xp:checkBox
        text="pH"
        id="checkBox1"
        value="#{document1.PH}"
        checkedValue="pH">
        <xp:eventHandler
        event="onclick"
        submit="true"
        refreshMode="partial"
        refreshId="routineSectionInput1"
        execMode="partial">
            <xp:this.action>
                <xp:executeScript>
                    <xp:this.script><![CDATA[#{javascript:var  
checkBox1:com.ibm.xsp.component.xp.XspInputCheckbox = getComponent("checkBox1");
    var routineSectionInput1:com.ibm.xsp.component.xp.XspInputText = getComponent("routineSectionInput1");
    if (checkBox1.getValue()=='pH'){
    routineSectionInput1.setValue('Selected');
    } else {
    routineSectionInput1.setValue('');
    }}]]></xp:this.script>
                                               </xp:executeScript>
            </xp:this.action>
            </xp:eventHandler>
            </xp:checkBox>

我在另一个xpage上使用了相同的字段名称和相同的代码,但它无效。我做错了什么?

祝你好运

3 个答案:

答案 0 :(得分:5)

当你使用涉及绑定的组件逻辑时,不要追踪组件,追踪定义其值的数据。所以你的代码看起来应该是这样的:

    <xp:checkBox text="pH" id="checkBox1"
    value="#{document1.PH}" checkedValue="pH">
    <xp:eventHandler
    event="onclick"
    submit="true"
    refreshMode="partial"
    refreshId="routineSectionInput1"
    execMode="partial">
        <xp:this.action>
            <xp:executeScript>
                <xp:this.script><![CDATA[#{javascript:var chkValue = document1.getItemValueString("PH");
                viewScope.routineSection = (chkValue=="pH") ? "Selected" : ""; 
            }]]></xp:this.script>
            </xp:executeScript>
        </xp:this.action>
        </xp:eventHandler>
        </xp:checkBox>
        <xp:text id="routineSectionInput1" value="#{viewScope.routineSection}"></xp:text>

希望有所帮助

答案 1 :(得分:1)

如果存在验证错误或组件的数据类型错误(例如,文本无法解析为绑定到Number字段的组件中的数字,那么转换错误),任何SSJS都将失败。

我建议在SSJS开头添加一个print语句来检查它是否正在触发。 (如果您对XPage更有信心,请使用PhaseListener检查正在触发的正确阶段。)

此外,值得添加一个显示错误控件来捕获部分刷新期间捕获的任何验证错误,确保它在刷新区域内(否则错误将不会显示在浏览器中)。

“未经验证的过程数据”选项可能在此处使用,您要跳过验证。请注意,转换错误仍会阻止SSJS运行。

正如Stephan所说,如果可能的话,使用数据源而不是组件。在SSJS触发之前,数据源已经更新。

答案 2 :(得分:0)

删除了复选框,用-c压缩了数据库,并用相同的代码添加了这些复选框。它现在正在运作。