2

a4j:commandButtonに「disabled」属性を含めると、ボタンのアクションは実行されません。'disabled'属性を削除すると、正しく機能します。私は(私が知っている)特別な検証を行っておらず、検証エラーメッセージも表示されていません。

これが私のページの一部です:

<t:dataTable id="myTable"
             var="region"
             value="#{MyPageBackingBean.regions}"
             width="100%">

...

<a4j:commandButton value="Update"
                   action="#{region.doUpdate}"
                   oncomplete="alert('done');"
                   disabled="#{!empty region && region.messageEmpty}"
                   immediate="true"/>

...

</t:dataTable>

何か案は?ありがとう!

編集:

t:dataTableでpreserveDataModel="true"を無効に設定してみました。

また、a4j:commandButtonとデータテーブルのないテキストボックスを使用してテストを行いましたが、バッキングBeanアクションがまだ実行されていません。

      <h:form>
     <a4j:region>
        <a4j:outputPanel id="testregion">
        <h:messages id="messages"/>

                          <a4j:status>
                             <f:facet name="start">
                                <h:graphicImage value="/images/progress_indicator.gif"/>
                             </f:facet>
                          </a4j:status>

                       <h:inputTextarea
                             rows="5"
                             value="#{MyPageBackingBean.myValue}"
                             style="width:100%; border: 1px solid #99CCFF;">
                          <a4j:support event="onkeyup"
                                       reRender="testregion"
                                       eventsQueue="messageModificationQueue"
                                       ignoreDupResponses="true"
                                       requestDelay="500"/>
                       </h:inputTextarea>

                       <a4j:commandButton id="doDelete"
                                          value="Delete"
                                          action="#{MyPageBackingBean.dummy}"
                                          reRender="testregion"
                                          disabled="#{empty MyPageBackingBean.myValue}"/>
                    <h:outputText value="#{MyPageBackingBean.myValue}"/>
        </a4j:outputPanel>
     </a4j:region>
  </h:form>

テストに使用される新しいバッキングBeanコードは次のとおりです。

private String m_myValue = null;
   public String getMyValue()
   {
      return m_myValue;
   }
   public void setMyValue(String value)
   {
      m_myValue = value;
   }
   private String mystr2 = null;
   public String dummy()
   {
      mystr2 = "hello";
      return null;
   }

ありがとう!

4

2 に答える 2

5

HTMLの世界では、このdisabled属性により、HTML入力要素(、、、および)の-属性ペアnamevalueサーバー側に送信されません。inputselecttextareabutton

JSFの世界では、name属性の存在は、サーバー側で呼び出されるBeanアクションを識別するために使用されます。ただし、フォーム送信のリクエスト値の適用フェーズ中に、JSFは、アクションを実行する前に、コンポーネントdisabled(およびrendered)の属性が評価されるかどうかもチェックします。true

これは、ゲッターがデフォルトでを返す#{region}反復テーブル行オブジェクトです。フォームの新しいリクエストでは、送信は明らかに空であり、ボタンを効果的に作成します。その場合、JSFは関連するアクションを呼び出しません。#{MyPageBackingBean.regions}isMessageEmpty()true#{MyPageBackingBean.regions}disabled

#{MyPageBackingBean.regions}重要なのは、それが後続のリクエストでまったく同じデータモデルを返すことを確認する必要があります。最も簡単な修正は、MyPageBackingBeanBeanをセッションスコープに配置して、後続のリクエストで再初期化されないようにすることですが、これにはさらに悪影響があります。もう1つの修正は、Beanコンストラクターで発生するようにデータモデルのロードを再配置することです。すでにTomahawkを使用しているため、その属性を<t:dataTable>に設定する必要があります。Datatablesの使用に関するその他のヒントについては、次の記事も役立つ場合があります:Datatablesの使用。preserveDataModeltrue

于 2010-02-03T19:41:42.150 に答える
1

a4j:commandButtonのdisabledプロパティについてもう1つ注意する必要があります。disabledプロパティがtrueに設定されている場合、ボタンのonclickイベントのajaxフックが最終的なHTMLにレンダリングされることはありません。つまり、次のようなボタンが表示されます。

<input type="button" onclick="return false" ... />

これの代わりに:

<input type="button" onclick="A4J.AJAX.Submit('....');return false" ... />

したがって、このようなことをしたい場合:

  1. a4j:buttonが無効になっているページをレンダリングする
  2. ユーザーインタラクションに基づいてクライアント側でa4j:buttonを有効にする
  3. a4j:buttonをクリックして、サーバー側のアクションを呼び出します

次に、代わりに次のようなことを行う必要があります。

  1. a4j:buttonとdisabled = "#{true}"を使用してページをレンダリングします
  2. ユーザーインタラクションにより、disabled = "#{false}"でa4j:buttonの再レンダリングがトリガーされます
  3. a4j:buttonをクリックして、サーバー側のアクションを呼び出します

簡単な例を次に示します。

<h:selectOneCheckbox value="#{myAction.booleanProperty}">
  <a4j:support event="onclick" reRender="button1" />
</h:selectOneCheckbox>
<a4j:commandButton id="button1" action="#{myAction.doSomething}" 
  disabled="#{myAction.booleanProperty eq false}" value="click me"
/>
于 2010-04-07T18:20:50.493 に答える