2

私のカスタム コントロールは、パネル内の多数のコンボ ボックスとテキスト入力ボックスで構成されています。コンボ ボックスの値は相互に依存するため、コンボ ボックスが変更されると、パネルで部分的な更新が実行され、他のコンボ ボックスの値が更新されます。

テキスト入力ボックスの 1 つは、コンボ ボックスの 1 つにも依存しています。たとえば、コンボ ボックスのタイトルが「特別な要件はありますか?」であるとします。値は「はい」と「いいえ」です。値が「No」の場合、special_requirements テキスト ボックスは非表示になり、querySaveDocument イベントでドキュメントに「N/A」として保存されます。値が「Yes」の場合、special_requirements テキスト ボックスが表示され、ユーザーは入力する必要があり、入力は保存されます。

私が抱えていた問題は、テキストボックスの「Visible」プロパティの値を計算すると、適切に表示/非表示になりますが、パネルが更新されるたびにユーザー入力がクリアされることです-たとえば、ユーザーが「はい」、いくつかのテキストを入力してから、部分的なリフレッシュを引き起こす別のコンボ ボックスを変更します。テキスト ボックスは表示されたままですが、現在は空になっています。

現在、「Visible」プロパティを計算する代わりに、CSS スタイルを計算し、テキスト ボックスが不要な場合は非表示に設定する回避策を使用しています。ただし、これは、コンボ ボックスで [いいえ] を選択したにもかかわらず、ユーザーが入力できることを意味するため、理想的なソリューションではありません。「Visible」プロパティを使用してコンボボックスオプションが「はい」から「いいえ」に変更された場合に、リフレッシュ間でユーザーの以前の入力を保持し、それを削除する方法はありますか?

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>

しかし、2 つのコンポーネントを入れ替えて、編集ボックスとコンボ ボックス (順序が重要であることを忘れないでください) があるようにしてから、コンボ ボックスの値を変更すると、編集ボックスが再び表示されたときに編集ボックスの値が復元されます (以下を参照)。コードスニペット)。

<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>

partial-refresh-triggering-component が送信される前のコンポーネントの値のようですが、他のコンポーネントは送信されません。この動作の理由については、わかりません。XPages を何度も再設計することになったので、誰かがこれに光を当てることができれば本当にうれしいです!

于 2013-02-14T14:29:51.750 に答える