0

テキスト フィールドのカスタム バリデーターに苦労しています。カスタム検証は、必要な検証が実行された後にのみ機能するようです。これは、requiredValidator のないフィールドはカスタム検証できないことを意味します。それは本当ですか? 私がしたいこと:

テキストフィールドがあります。値は、別のフィールドで特定の値が選択されている場合にのみ必要です (ここでは、これはチェックボックス グループです)。これは依存検証です。テキスト フィールドが必要になるまで、カスタム バリデータは正常に動作しますが、そうではありません。

チェックボックスには特定の値がありません -> テキストフィールドは空白にすることができます
チェックボックスは値を保持します -> テキストフィールドには値が必要です。

何か案は?

    <xp:inputText id="inputText1" disableClientSideValidation="true">
</xp:inputText>

<xp:inputText id="inputText2" disableClientSideValidation="true">

    <xp:this.validators>
        <xp:customValidator message="err">
            <xp:this.validate><![CDATA[#{javascript:if(getComponentValue("inputText1").length>0 && getComponentValue("inputText2").length==0) postValidationError(this, "foo")}]]></xp:this.validate>
        </xp:customValidator>

    </xp:this.validators>
</xp:inputText>

ここで、getComponentValue はコンポーネントから getValue または getSubmittedValue を使用して値を受け取るメソッドであり、postValidationError は Faces メッセージを追加するメソッドです。

編集と最終回答

結論とサンプルはこちら: http://mardou.dyndns.org/Privat/osnippets.nsf/id/OBUE-95BLK4

4

1 に答える 1

3

必要なバリデーターは常に、検証中に実行される最初のバリデーターです。つまり、質問の最初の部分に対する答えは YES です。

ただし、これは、カスタム バリデーターを使用するために必要なバリデーターが必要であることを意味するものではありません。質問のこの部分には、明確な NO で回答する必要があります。

必要なバリデーターは、特別な種類の「ハック」です。バリデーターは、コンポーネントが新しい値を受け取った場合 (空白ではない場合) にのみ実行されるためです。

カスタムバリデーターに問題がある理由がわかりません-説明しているシナリオでは、必要なバリデーターを使用しているだけです...

編集

「バリデータを変える」だけです。カスタムバリデータをinputText2からinputText1に追加すると、機能するはずです。

編集2:

<xp:inputText id="inputText1" disableClientSideValidation="true">
   <xp:this.validators>
      <xp:customValidator message="err">
         <xp:this.validate><![CDATA[#{javascript:
            var val = getComponent("inputText2").getSubmittedValue();
               if( val.equals("") == true )
                  return false;
               null}]]>
         </xp:this.validate>
      </xp:customValidator>
   </xp:this.validators>
</xp:inputText>

<xp:inputText id="inputText2" disableClientSideValidation="true" />
于 2013-02-26T22:17:16.380 に答える