2012-02-22 126 views
0

我遇到了一個對我沒有任何意義的問題。我有一個列表框,用簡單的Ajax觸發selectionChange-Events。這個想法是,編輯按鈕沒有被啓用,直到列表中的一個項目被選中。所以我創建了下面的代碼。使用ajax啓用/禁用按鈕時,不會觸發操作

<h:form> 
    <h:selectManyListbox value="#{bean.selectedIds}"> 
     <f:selectItems value="#{bean.listOfItems}" /> 
     <f:ajax render="edit" 
      listener="#{bean.selectionChanged}" /> 
    </h:selectManyListbox> 
    <br /> 

    <h:commandButton id="add" value="#{msgs.add}" 
     action="#{bean.addNew}" /> 

    <h:commandButton id="edit" value="#{msgs.edit}" 
     disabled="#{bean.editButtonDisabled}" 
     action="#{bean.edit}" /> 
</h:form> 

按鈕啓用,當我想禁止,但事實證明,編輯鍵觸發的心不是任何行動(我加了一些系統輸出在bean和編輯 - 添加 - 中和編輯方法方法永遠不會被調用)...而是改變html。上面的代碼嵌套在一個簡單的div中。當我點擊編輯時,整個表單就在該div之外。

當我將這個ajax行爲添加到添加按鈕時,發生同樣的情況,反之亦然,當我從編輯按鈕中刪除禁用的屬性一切正常?

我已經看過BalusC的回答here但我找不到與該列表有關的任何錯誤。沒有嵌套的表單等......它只是一個帶模板的簡單頁面。

我在JBoss 7.1.Final上使用Mojarra 2.1.2。

任何幫助表示讚賞。由於

+0

你不需要重新渲染整個窗體,因爲commandButton動作將被附加到HTML表單元素? – 2012-02-22 11:04:50

+0

我試過了,但沒有幫助。此外,爲什麼我需要渲染表單?我預計由此創建的JavaScript只會改變DOM樹中的按鈕。 – lostiniceland 2012-02-22 12:19:19

+0

這只是一個猜測。我不太確定如何實現禁用/啓用。您是否嘗試了與渲染相同的操作,例如有兩個按鈕有條件呈現? – 2012-02-22 12:31:56

回答

2

此問題是由應答點5所覆蓋,你有聯繫。

組件的rendered屬性和所有的父組件的過程中的形式的應用請求值相應的計算結果不是false提交請求。 JSF將重新檢查它,作爲防範篡改/黑客請求的一部分。將bean放入視圖範圍和/或確保你預先初始化bean的(後)構造函數中的條件應該修復它。 這同樣適用於組件的disabled屬性,在處理表單提交期間,該屬性不應評估爲true

我建議在BikeManagementPanelBean改變@RequestScoped@ViewScoped

+0

Ups :-D 我讀過ViewScoped是最好的方式去,但我使用的CDI不是有這個範圍: -/ 當我按照上面的語句(預初始化postconstruct中的條件):wouldnt這意味着該屬性將始終保持爲假(在我的情況下,因爲按鈕應該被禁用,如果沒有選擇發生)? – lostiniceland 2012-02-22 13:19:46

+1

如果您基於某個請求參數正確預初始化,請不要使用它。提交的下拉值可作爲請求參數。是的,這很醜陋,這就是爲什麼視圖範圍存在的原因,以便您在與相同視圖交互時不需要擺弄請求參數。至於CDI的觀點範圍,你最好的選擇是'@ ConversationScoped'。 – BalusC 2012-02-22 13:21:08

+0

再次感謝。我會嘗試。應該可以使用ViewParameter。 – lostiniceland 2012-02-22 13:24:42

0

嘗試這樣的事情

<h:commandButton id="edit" value="#{msgs.edit}" 
    disabled="#{bikeManagementPanelBean.editButtonDisabled eq false}" 
    action="#{bean.edit}" /> 

嘗試與<h:panelGroup>再次將它包裝和渲染,而不是按鈕...

+0

感謝您的快速回復。不幸的是,包裝並不能解決這個問題,並且渲染表單也沒有(請參閱第二個問題的評論) – lostiniceland 2012-02-22 12:21:32

+0

重新編輯我的答案... – Daniel 2012-02-22 12:29:00

+0

ALMOST :-D 它仍然無法正常工作,但是當我打開該頁面時啓用該按鈕。 ..行動被觸發。所以看起來就像一旦ajax調用發生了,它就會引起一些問題。我看了一下html源代碼,但這裏沒有任何改變。是否有Firefox的另一個附加組件顯示實際的DOM? – lostiniceland 2012-02-22 12:40:27