2013-05-12 132 views
0
<h:form> 
      <h:selectOneMenu value="#{productBean.productName}"> 
       <f:selectItem itemValue="" itemLabel="..." /> 
       <f:selectItems value="#{productBean.pizza}" var="pizza" itemValue="#{pizza.name}" itemLabel="#{pizza.name}" /> 
       <f:ajax listener="#{productBean.valueChanged(productBean.productName)}" render="pizzaResult pizzaButton" /> 
      </h:selectOneMenu> 
      <h:commandButton value ="Dodaj do zamówienia" disabled="#{productBean.isDisabled}" id="pizzaButton" onclick="#{productBean.order}"/> 
      <h:outputText id="pizzaResult" value="#{productBean.message}" /> 
     </h:form> 

這是我的JSF表單。我使用了valueChanged監聽器來使按鈕在ome情況下變成暗淡的,並且效果很好。但我不明白爲什麼它也會觸發onclick按鈕。如何做一些事情,使我只能在點擊按鈕後使用按鈕?JSF監聽器觸發按鈕onclick

我注意到,當我刪除禁用選項時,它的效果很好:/但爲什麼當這個時候啓用按鈕時我無法觸發該操作?

+0

「但我不明白爲什麼它也觸發按鈕onclick」 - 我沒有看到按鈕上的onclick列表器! – Nikhil 2013-05-12 16:04:19

+0

此外,相關的一點是 - 您不需要其他''呈現'pizzaButton'您可以將其添加到您的上一個作爲'render =「pizzaResult pizzaButton」' – Nikhil 2013-05-12 16:08:15

+0

'如何做一些使我點擊後只能使用按鈕,你希望你的按鈕可以使用後點擊一下? – 2013-05-13 01:32:31

回答

0

好的,我做到了。問題是該按鈕可能顯示爲啓用(disabled="false")但其客戶端更改和服務器不知道它,並且應用程序認爲該按鈕仍處於禁用狀態。即使它看起來像啓用按鈕,它不會與action="#{something}"工作。 您必須讓服務器知道有關更改。我唯一要做的就是將@ViewScoped添加到託管bean。現在,禁用和啓用按鈕的操作也被服務器看到,並且完美地工作。

但是我有一個問題。客戶端驗證是一個壞主意。禁用按鈕是阻止用戶發送空的itemValue或產品(在我的情況下)不可用的唯一東西(數據庫中的is_available = 0)。問題是:確保安全嗎?

編輯:不幸的是,單擊按鈕後,即使oneSelectMenu轉換爲第一個空值,按鈕也會啓用。在改變列表之後,它再次與之前一樣工作,並且在再次點擊之後,情況再次需要時間。

0

onclick是一個客戶端屬性,因此您不應該嘗試將其綁定到託管bean方法調用,它看起來好像您做了onclick=#{productBean.order}(除了缺少的引號外)。這可能是你的問題的原因。

+0

我注意到剛纔,你說得對:)其實,我完全誤解了這個問題! – Nikhil 2013-05-12 15:40:22

+0

嗯,我不是100%確定我自己,但看起來像這可能是 – dratewka 2013-05-12 15:42:45

+0

我手動添加它在stackoverflow文本字段,因爲我從我的IDE複製它沒有onlick。它與「」 – 2013-05-12 18:10:09