Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在jsf中完成javascript调用后,如何调用侦听器或支持bean方法?_Jsf_Jsf 2_Event Handling_Jsf 2.2 - Fatal编程技术网

在jsf中完成javascript调用后,如何调用侦听器或支持bean方法?

在jsf中完成javascript调用后,如何调用侦听器或支持bean方法?,jsf,jsf-2,event-handling,jsf-2.2,Jsf,Jsf 2,Event Handling,Jsf 2.2,根据我的场景,需要首先调用javascript。javascript调用后,将更新两个隐藏值。使用更新的隐藏值,必须调用Bean方法。在这个场景中,我同时被调用javascript和bean方法。因此,在我的bean方法中,我不会在隐藏字段中获得更新的值 小细节解释 文本框(地址)用于键入地址。以及具有两个隐藏元素,用于基于地址字段存储街道名称和城市名称 通过Javascript调用,从google maps API(codeAddress())收集两个值(街道名称和城市名称)。根据文本框中输入

根据我的场景,需要首先调用javascript。javascript调用后,将更新两个隐藏值。使用更新的隐藏值,必须调用Bean方法。在这个场景中,我同时被调用javascript和bean方法。因此,在我的bean方法中,我不会在隐藏字段中获得更新的值

小细节解释

文本框(地址)用于键入地址。以及具有两个隐藏元素,用于基于地址字段存储街道名称和城市名称

通过Javascript调用,从google maps API(codeAddress())收集两个值(街道名称和城市名称)。根据文本框中输入的地址更新两个隐藏字段(街道和城市)。Bean方法必须处理更新的隐藏值

但是从我的代码来看,支持bean和java脚本是同时调用的。因此,我没有在支持Bean中获得更新的值

我的代码如下:

JSF代码

<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中,收集值并使用两个文本框进行设置。更新后的值再次调用backingbean中的checkAddress()方法仅供参考:*checkAddress()*是一个AJAX调用。我在JSF的h:commandButton中犯了错误,但不知道如何修复它。非常感谢您的帮助。

请尝试在f:ajax中使用event=“”,然后使用OneEvent调用javascript函数。 事件值将是“click”,onevent值将是javascript函数的名称。喜欢

您可以尝试为JavaScript设置延迟
setTimeout()



1000毫秒=1秒,为了方便起见,您只需更改该值

您提供的代码有一些奇怪的地方:

  • 我认为不需要
    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>

验证地址
$(“.clickMe”)。单击(功能(ev){
ev.preventDefault();
$.getJSON(
"https://maps.googleapis.com/maps/api/geocode/json", 
{地址:$(“#addrF\\\:address”).val()},
功能(数据){
//赛特街、城市
$('#addrF\\:submitBtn')。单击();
}
);
});

您可能需要额外的值验证等,并且您对mapsapi的访问可能会有所不同(我根本没有使用它)。关键是:只有在ajax调用完成后,才需要在隐藏的
命令按钮上
单击()

为什么不删除“actionListener”属性,并对验证器执行相同的操作?或者在submit方法中移动那个逻辑。@mitpatoliya:你能再解释一下吗。“提交方法”是什么意思?@mitpatoliya:从commandButton中删除了actionListener属性,并将listener属性放置在ajax标记中。还是一样的结果。这是你想说的吗?既然你需要在用户点击时从javascript填充bean数据,为什么不尝试将数据从js传递到支持bean?但是如果你仍然感兴趣,primefaces是可能的,然后您可以使用本文中的方法:安全性当然取决于您的实现。但是不能在侦听器调用之前调用javascript调用。请看一下我的剧本。我在我的项目中也使用了同样的方法。。我的情况是,应该只为下拉列表中的某些选定值调用listner。我无法停止,所以我在listener之前调用了一个javascript函数,它将新值替换为null,而我的listener在得到null值时什么也不做。希望它能解决在JSF操作调用之前必须首先调用JavaScript的问题。这会有帮助吗?对不起,我误解了,请尝试(在您的支持Bean中)此RequestContext=RequestContext.getCurrentInstance();更新(“yourForm:yourComponent”);这些行必须位于bean方法的最末尾
<h:commandButton type="submit" value="Verify Address"
            onclick="setTimeout(function(){checkAddress()},1000);">
<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>