2013-02-14 70 views
2

我的自定义控件由面板中的多个组合框和文本输入框组成。组合框值相互依赖,所以当组合框更改时,将在面板上执行局部刷新以刷新其他组合框的值。部分刷新面板中有条件隐藏的编辑框

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

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

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

+2

你能发布一些示例代码? - 分析问题会更容易 – 2013-02-14 12:43:03

回答

6

假设Naveens例子是像你一样的问题,你有JSF生命周期一个简单的问题:如果一个组件的更新模型阶段中是不可见的,提交的内容不被应用和丢失。

只要改变色性这样:

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

谢谢Sven!这工作。 – Naveen 2013-02-14 16:32:43

+0

辉煌,谢谢。 – 2013-02-14 21:31:42

+0

谢谢,工作正常 – 2015-03-18 10:48:18

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> 

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

+0

看看我对这个问题的回答。这是JSF生命周期的一个问题:* comboBox *在* inputText *之前获得值* yes *。在提交的值更新之前,将检查* inputText *组件的* rendered *属性:它是错误的,因为* comboBox *值是* yes *,并且* inputText *的新值会丢失。如果* inputText *在* comboBox *之前,则呈现的属性为true,并更新提交的值。 – 2013-02-14 15:24:09