如何在jsf中完成javascript调用后调用listener或backing bean方法?

时间:2014-03-25 05:56:04

标签: jsf jsf-2 event-handling jsf-2.2

根据我的场景,需要先调用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中做错了,但是不知道如何修复它。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

您提供的代码有几个奇怪的地方:

  • 我认为不需要prependId
  • onclick上定义commandButton是一个坏主意[tm]
  • 通过使用JS函数一个名为checkAddress
  • 的bean方法,您正在设置自己和/或继承该代码的人头疼
  • 你似乎根据被解雇的行动做了什么? (有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秒,您只需更改该值以方便