2

サーバー側の検証で問題が発生していますが、これが XPages で予期される動作なのか、それともここで何か単純なものが欠けているのかわかりません。

計算された検証式を持つフィールドがあります-基本的に、viewScope変数が設定されると必要になります。

私の送信ボタンはviewScopeを設定し、完全に更新します。

フォームが送信され、検証式が評価され、失敗した場合は検証の失敗が表示されると思います。しかし、送信ボタンをクリックすると、フォームはエラーなしで送信されます。もう一度クリックすると、期待どおりに検証が失敗します。

私の問題を説明するために、簡単な例を作成しました。

<xp:inputText id="inputText1" required="#{javascript:viewScope.validate}">
    <xp:this.validators>
        <xp:validateRequired message="This field is required."></xp:validateRequired>
    </xp:this.validators>
</xp:inputText>
&#160;
<xp:button value="Submit" id="button1">
    <xp:eventHandler event="onclick" submit="true"
        refreshMode="complete" immediate="false" save="true">
        <xp:this.action><![CDATA[#{javascript:viewScope.validate=true;}]]></xp:this.action>

        <xp:this.script><![CDATA[dojo.attr(dojo.byId("#{id:inputText1}"),"aria-required","true")]]></xp:this.script>
    </xp:eventHandler>
</xp:button>
<xp:br></xp:br>
<xp:message id="message1" for="inputText1"></xp:message>

ご覧のとおり、検証を開始することを期待して、ボタン内に csjs を使用して aria-required 属性を追加しようとしました。

検証が期待どおりに機能している場合、このような動的検証を適切に機能させるための提案はありますか? データ ソースで querySave を使用して何かできることはわかっていますが (簡単にするために、例からデータ ソースを除外しました)、それよりも簡単な解決策があることを望んでいました。

4

2 に答える 2

2

問題はライフサイクルを誤解しているようです。viewScope 変数でフィールドが必須かどうかを指定しています。ページが最初にロードされたとき、viewScope は false であるため、フィールドは必要ありません。送信後、viewScope 変数が設定され、ページが再度レンダリングされます。フィールドが必須になるのは今だけですが、次回フォームが送信されたときにのみ必須になります。

フィールドを必須にする場合は、フォームが送信される前に、required プロパティが true と評価され、ブラウザーに渡される必要があります。

管理しようとしている機能には、SSJS を実行し、特定の基準が満たされた場合に失敗するという代替手段がいくつかあります。

1 つは、必要なプロパティを計算するのではなく、バリデータ プロパティを使用することです。バリデーターを使用するとコードを実行できますが、 this.getSubmittedValue() を使用してフィールドの値を確認する必要があります。バリデーターは、ライフサイクルの早い段階で、submitValue が value プロパティに渡される前に実行されます。

2 番目のオプションは、[送信] ボタンに検証を配置することです。facesContext.addMessage() を使用できます。xpages facesContext addMessage をグーグルで検索すると、その方法の例がたくさんあります。次に、「return false」を実行して中止します。

于 2012-09-06T21:16:13.410 に答える
1

条件付き検証が必要なようです。私はこれについてしばらく前にブログ投稿を書きました:

バリデーションを適切に動作させる

于 2012-09-07T05:35:08.973 に答える