簡體   English   中英

設置為“禁用”時,JSF a4j:commandButton不起作用

[英]JSF a4j:commandButton not working when 'disabled' is set

當我在a4j:commandButton上包含“ 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上的prepareDataModel =“ true”設置為無效。

我還進行了一個測試,該測試具有a4j:commandButton和沒有數據表的文本框,但仍未觸發backing 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;
   }

謝謝!

在HTML世界中, disabled屬性導致任何HTML輸入元素( inputselecttextareabutton )的name - value屬性對都不會發送到服務器端。

在JSF世界中, name屬性的存在被用來標識要在服務器端調用的bean操作。 但是,在表單提交的“申請請求值”階段,JSF還會在執行任何操作之前檢查組件的disabled (和rendered )屬性是否為true

#{region}在這里是#{MyPageBackingBean.regions}isMessageEmpty()行對象,其isMessageEmpty() getter默認情況下返回true 在表單的新請求中,提交#{MyPageBackingBean.regions}顯然為空,這實際上使該按鈕處於disabled 然后,JSF將不會調用關聯的操作。

到目前為止,您需要確保#{MyPageBackingBean.regions}在后續請求中返回完全相同的數據模型。 最簡單的解決方法是將MyPageBackingBean bean放置在會話范圍內,這樣就不會在后續請求中將其重新初始化,但這也會帶來更多負面影響。 另一個解決方法是重新安排數據模型的加載,使其在bean構造函數中發生。 由於您已經在使用Tomahawk的<t:dataTable> ,因此需要將其preserveDataModel屬性設置為true 有關使用數據表的更多提示,您可能會發現本文也很有用: 使用數據表

關於a4j:commandButton的disabled屬性要注意的另一件事:如果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:按鈕以調用服務器端操作

然后,您將需要執行以下操作:

  1. 呈現頁面並帶有a4j:button和disable =“#{true}”
  2. 讓用戶交互觸發禁用了=“#{false}”的a4j:button的重新渲染
  3. 單擊a4j:按鈕以調用服務器端操作

這是一個簡單的例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM