2014-03-25 32 views
2

根據我的情況,需要首先調用javascript。在javascript調用之後,兩個隱藏值將被更新。使用更新後的隱藏值,必須調用Bean方法。在這種情況下,我正在同時調用javascript和bean方法。所以在我的bean方法中,我沒有得到隱藏字段中的更新值。在jsf中完成javascript調用後如何調用listener或backing bean方法?

點點詳細解釋

文本框(地址)被用來輸入地址。並有兩個隱藏的元素,用於根據地址字段存儲街道名稱和城市名稱。

通過Javascript調用,從谷歌地圖API(codeAddress())收集兩個值(街道名稱和城市名稱)。基於在更新兩個隱藏字段(街道和城市)的文本框中輸入的地址。 Bean方法必須處理更新後的隱藏值。

但是從我的代碼中,同時調用Backing bean和java腳本。所以我沒有得到Backing Bean中的更新值。

我的代碼是下面的:

JSF CODE

<h:form prependId="false"> 
    <div id="panel-one"> 
     <h:outputLabel value="ADDRESS"/> 
     <h:inputText type="text" id="address" size="40" value="#{Bean.address}"/> 
     <h:inputHidden id="street" value="#{Bean.streetName}" /> 
     <h:inputHidden id="city" value="#{Bean.city}" /> 
     <h:commandButton type="submit" value="Verify Address" 
      onclick="checkAddress()"> 
      <f:ajax execute="@form" render="@none" listener="#{Bean.checkAddress()}"/> 
     </h:commandButton> 
    </div> 
</h:form> 

的Javascript

checkAddress() { 
    document.getElementById("street").value = //Setting value from other javascript API; 
    document.getElementById("city").value = //Setting value from other javascript API; 
} 

在上述的javascript收集值以及具有兩個文本框設置它。使用更新的值再次調用支持bean中的checkAddress()方法。 供參考: * checkAddress() *是AJAX呼叫。我在JSF的h:commandButton中犯了錯誤,但不知道如何解決它。任何幫助深表感謝。

+0

爲什麼不直接刪除「actionListener」屬性,只用驗證器做同樣的事情?否則,請在提交方法中移動該邏輯。 – mitpatoliya

+0

@mitpatoliya:請你多解釋一下。提交方法是什麼意思? – ArunRaj

+0

@mitpatoliya:從commandButton中刪除actionListener屬性,並將偵聽器屬性放入ajax標記中。仍然是同樣的結果。這是你試圖說的嗎? – ArunRaj

回答

2

是有幾件事情奇與您提供的代碼:

  • 我沒有看到需要prependId
  • commandButton定義onclick是一個壞主意(TM)
  • 你就把自己和/或由具有JS功能 bean方法都被稱爲checkAddress
  • 繼承的代碼了一個頭痛的人
  • 基於被解僱的行爲,你似乎沒有做任何事情? (有render="@none"

這就是說,一種黑客應該做你需要的是隱藏實際的按鈕,單擊它編程:

<h:form id="addrF"> 
    <h:outputLabel value="ADDRESS"/> 
    <h:inputText type="text" id="address" size="40" value="#{bean.address}"/> 
    <button class="clickMe">Verify Address</button> 

    <h:inputHidden id="street" value="#{bean.streetName}" /> 
    <h:inputHidden id="city" value="#{bean.city}" /> 

    <h:commandButton id="submitBtn" style="display:none;"> 
     <f:ajax execute="@form" render="@none" listener="#{Bean.checkAddress()}"/> 
    </h:commandButton> 
</h:form> 
<h:outputScript> 
    $(".clickMe").click(function(ev) { 
     ev.preventDefault(); 
     $.getJSON(
      "https://maps.googleapis.com/maps/api/geocode/json", 
      { address : $("#addrF\\:address").val() }, 
      function(data) { 
       // set street, city 
       $('#addrF\\:submitBtn').click(); 
      } 
     ); 
    }); 
</h:outputScript> 

你可能需要額外的價值的驗證等,您對地圖API的訪問可能不同(我根本沒有使用它)。重點是:只有在您的ajax調用完成後,您才需要在隱藏的commandButton上登錄click()

+0

感謝您的好解釋。它真的幫助我。 – ArunRaj

+1

不客氣。很高興聽到它的幫助。 – mabi

0

請嘗試在f:ajax中使用event =「」,然後使用onevent調用javascript函數。 事件值將是「點擊」,onevent值將是JavaScript函數的名稱。像

+0

在上面的方法中,我們可以觸發javascript調用。但在偵聽器調用之前無法調用JavaScript調用。請通過我的場景。 – ArunRaj

+1

我在我的項目中使用過同樣的情況..我的情況該列表程序應該只在下拉列表中選擇某些值。我無法停止,因此我在調用監聽器之前調用了一個javascript函數,該函數將空值替換爲新值,並且當偵聽器得到空值時,它不做任何事情。希望它能解決你的問題 – Sudhanshu

0

你可以嘗試設置延遲了JavaScript的setTimeout()

<h:commandButton type="submit" value="Verify Address" 
      onclick="setTimeout(function(){checkAddress()},1000);"> 

1000毫秒= 1秒,你只需要改變該值爲了您的方便

+0

在JSF動作調用之前,Javascript必須先調用。它會有幫助嗎? – ArunRaj

+0

對不起,我誤解了,嘗試(在你的Backing Bean)這個RequestContext context = RequestContext.getCurrentInstance(); context.update(「yourForm:yourComponent」); 這些行必須在bean方法的最後一行 –

相關問題