在部分刷新的面板中有条件地隐藏编辑框

时间:2013-02-14 12:30:14

标签: xpages

我的自定义控件由面板中的许多组合框和文本输入框组成。组合框值彼此依赖,因此当更改组合框时,将在面板上执行部分刷新以刷新其他组合框的值。

其中一个文本输入框也依赖于其中一个组合框 - 假设组合框标题是“你有什么特殊要求吗?”值为“是”和“否”。如果值为“否”,则隐藏special_requirements文本框,并在querySaveDocument事件中将其保存为文档“N / A”。如果值为“是”,则显示special_requirements文本框,用户必须将其填写,并保存其输入。

我遇到的问题是,如果我计算文本框的“可见”属性的值,那么它会被适当地显示/隐藏,但只要刷新面板,任何用户输入都会被清除 - 例如用户选择“是”,输入一些文本,然后更改另一个导致部分刷新的组合框 - 文本框仍然显示,但现在为空。

目前我正在使用一种解决方法,而不是计算“Visible”属性,我计算CSS样式,在不需要文本框时将其设置为隐藏。但是,这意味着用户可以输入它,尽管在组合框中选择“否”,因此它不是理想的解决方案。是否有一种方法可以在刷新之间保留用户以前的输入,如果使用“可见”属性将组合框选项从“是”更改为“否”,则将其删除?

2 个答案:

答案 0 :(得分:6)

假设Naveens示例与您的问题相同,那么您在JSF生命周期中遇到一个简单的问题:如果在更新模型阶段期间组件不可见,则不会应用提交的内容并获取丢失。

只需将渲染属性更改为:

<xp:this.rendered>
   <![CDATA[#{javascript:
      if( view.isRenderingPhase() ){
         return getComponent("comboBox1").getValue() == "Yes"
      }else{
         return true;
      }
   }]]>
</xp:this.rendered>

答案 1 :(得分:1)

我在一段时间后遇到了类似的问题而我认为你正面临同样的问题。这是我发现的。

假设你的面板中有组合框然后编辑框(顺序很重要),编辑框的可见性取决于组合框的值。当您更改组合框的值时,编辑框可见或隐藏,但其值将被清除(请参阅下面的代码段)。

<xp:panel id="panel1">
    <xp:comboBox id="comboBox1">
        <xp:selectItem itemLabel="No" itemValue="No"></xp:selectItem>
        <xp:selectItem itemLabel="Yes" itemValue="Yes"></xp:selectItem>
        <xp:eventHandler event="onchange" submit="true"
            refreshMode="partial" refreshId="panel1">
        </xp:eventHandler>
    </xp:comboBox>
    <xp:inputText id="inputText1">
        <xp:this.rendered><![CDATA[#{javascript:getComponent("comboBox1").getValue() == "Yes"}]]></xp:this.rendered>
    </xp:inputText>
</xp:panel>

但是如果我交换这两个组件以便我们有编辑框然后组合框(记住,顺序很重要)然后更改组合框的值,当编辑框再次可见时,编辑框中的值将被恢复(请参阅下面的代码段。)

<xp:panel id="panel1">
    <xp:inputText id="inputText1">
        <xp:this.rendered><![CDATA[#{javascript:getComponent("comboBox1").getValue() == "Yes"}]]></xp:this.rendered>
    </xp:inputText>
    <xp:comboBox id="comboBox1">
        <xp:selectItem itemLabel="No" itemValue="No"></xp:selectItem>
        <xp:selectItem itemLabel="Yes" itemValue="Yes"></xp:selectItem>
        <xp:eventHandler event="onchange" submit="true"
            refreshMode="partial" refreshId="panel1">
        </xp:eventHandler>
    </xp:comboBox>
</xp:panel>

似乎部分刷新触发组件之前的组件中的值已提交,而其他组件则未提交。关于这种行为的原因,我有没有的想法!我真的很想,如果有人能够对此有所了解,因为这导致我重新设计我的XPages很多次了!