在jsf中完成javascript调用后,如何调用侦听器或支持bean方法?
根据我的场景,需要首先调用javascript。javascript调用后,将更新两个隐藏值。使用更新的隐藏值,必须调用Bean方法。在这个场景中,我同时被调用javascript和bean方法。因此,在我的bean方法中,我不会在隐藏字段中获得更新的值 小细节解释 文本框(地址)用于键入地址。以及具有两个隐藏元素,用于基于地址字段存储街道名称和城市名称 通过Javascript调用,从google maps API(codeAddress())收集两个值(街道名称和城市名称)。根据文本框中输入的地址更新两个隐藏字段(街道和城市)。Bean方法必须处理更新的隐藏值 但是从我的代码来看,支持bean和java脚本是同时调用的。因此,我没有在支持Bean中获得更新的值 我的代码如下: JSF代码在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())收集两个值(街道名称和城市名称)。根据文本框中输入
<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
是个坏主意[tm]onclick
- 您将自己和/或继承该代码的人置于头痛的境地,因为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>