2

我的自定义控件由面板内的许多组合框和文本输入框组成。组合框的值相互依赖,因此当组合框发生变化时,会在面板上执行部分刷新以刷新其他组合框的值。

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

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

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

4

2 回答 2

6

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

只需将渲染属性更改为:

<xp:this.rendered>
   <![CDATA[#{javascript:
      if( view.isRenderingPhase() ){
         return getComponent("comboBox1").getValue() == "Yes"
      }else{
         return true;
      }
   }]]>
</xp:this.rendered>
于 2013-02-14T14:43:01.650 回答
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!

于 2013-02-14T14:29:51.750 回答