1

JSF+PrimeFacesでWebアプリケーションをビルドしています。Webフォームで、primefacesのコマンドボタンのdisableプロパティをtrueに設定しました。フォーム入力フィールドでカスタムクライアント側の検証を実行した後にフォームが読み込まれる場合、フォームへのユーザー入力に応じて、コマンドボタンのdisableプロパティをfalseまたはtrueに設定します。 注:ここで、すべての検証がボタンを通過すると有効になりますが、同時にユーザーが一部の入力を編集して検証が失敗すると、ボタンは再び無効になります。

<p:commandButton id="saveButton" value="Save" actionListener="#{some method of bean}" 
update="component to update" disabled="true" />

しかし、ボタンが正しく機能しません。つまり、フォームが送信されていません。

ただし、ボタンのdisabledプロパティが最初にtrueに設定されていない場合、カスタム検証中であっても、(上記で説明したように)javascriptによって無効/有効になります。これは正常に機能します。

javascriptで設定しているのに、このフォームの送信がコマンドボタンのdisabledプロパティの初期値にどのように依存しているか理解できません。

ブラウザのソースに示されているHTMLコードは次のとおりです。

プロパティが無効になっている場合はtrueに設定します。

<button id="saveButton" 
class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" 
type="submit" 
onclick="PrimeFaces.ab({formId:'createAccessPrivilegeForm',source:'saveButton',process:'@all',update:'centerPanel leftNavigationForm:leftNavigationTabView'});return false;" 
name="saveButton" 
role="button" 
aria-disabled="false">

無効なプロパティがfalseに設定されている場合:

<button id="saveButton" 
class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only ui-state-disabled" 
disabled="disabled" 
type="submit" 
onclick="PrimeFaces.ab({formId:'createRoleForm',source:'saveButton',process:'@all',update:'centerPanel leftNavigationForm:leftNavigationTabView'});return false;" 
name="saveButton" 
role="button" 
aria-disabled="true">

このシナリオを処理するのを手伝ってください。コマンドボタンを最初は無効にするだけにしたいのですが、検証が完了した後でのみ無効にし、フォームの送信ができるようにしたいのです。

4

1 に答える 1

7

JavaScript側ではなく、JSF側でdisabled属性を変更する必要があります。つまり、disabled属性は、JSFでのフォーム送信の処理中に、JSFコンポーネントツリーの状態に基づいて再評価されます。クライアント側でHTMLDOMツリーを手動で編集しても、サーバー側のJSFコンポーネントツリーが自動的に変更されることはありません。

ボタンを有効/無効にするには、JavaScriptアプローチを適切なJSFアプローチに置き換える必要があります。チェックボックスに基づいてこれを行う基本的な例を次に示します。

<h:selectBooleanCheckbox value="#{bean.checked}">
    <p:ajax update="button" />
</h:selectBooleanCheckbox>
<p:commandButton id="button" ... disabled="#{bean.checked}" />
于 2012-06-10T13:18:32.350 に答える