根据我的场景,需要先调用javascript。在javascript调用之后,将更新两个隐藏值。使用更新的隐藏值,必须调用Bean方法。在这种情况下,我同时被称为javascript和bean方法。所以在我的bean方法中,我没有在隐藏字段中获取更新的值。
稍微详细说明
文本框(地址)用于键入地址。并且有两个隐藏元素,用于根据地址字段存储街道名称和城市名称。
通过Javascript调用,从Google地图API( codeAddress())收集两个值(街道名称和城市名称)。根据文本框中输入的地址更新两个隐藏字段(街道和城市)。 Bean方法必须处理更新的隐藏值。
但是从我的代码中,Backing bean和java脚本被同时调用。所以我没有在Backing Bean中获得Updated值。
我的代码如下:
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 CALL 。我在h:JSF的commandButton中做错了,但是不知道如何修复它。非常感谢任何帮助。
答案 0 :(得分:2)
您提供的代码有几个奇怪的地方:
prependId
onclick
上定义commandButton
是一个坏主意[tm] 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>
您可能需要额外的值验证等,并且您对maps API的访问可能会有所不同(我根本没有使用它)。关键是:只有在完成ajax调用后,您才需要{隐藏click()
commandButton
。
答案 1 :(得分:0)
请尝试使用event =&#34;&#34;在f:ajax然后使用onevent来调用javascript函数。 事件值将是&#34;点击&#34;和一个值将是javascript函数的名称。喜欢
答案 2 :(得分:0)
您可以尝试为JavaScript setTimeout()
<h:commandButton type="submit" value="Verify Address"
onclick="setTimeout(function(){checkAddress()},1000);">
1000毫秒= 1秒,您只需更改该值以方便