当选择一个选项时,它会在控制器中触发一个方法调用,该方法调用会更改regionController.invalidRegion值(true为false,反之亦然)。问题是它在第一次更改后,客户端不再更新该值,而是在服务器端正确更改。
我有以下js;
var renderRegionMsg = function(val){
if(val === "true"){
alert("true");
document.getElementById("NavForm:regionform:notInRegion").style.visibility = "";
}
else{
alert("false");
document.getElementById("NavForm:regionform:notInRegion").style.visibility = "hidden";
}
};
以及以下jsf代码:
<h:selectOneMenu id="regionSelect" >
<f:selectItems ...... />
<f:ajax
id="regionListener"
listener="#{geoListProducer.changeRegion}"
render="stripe-provState"
onevent="renderRegionMsg('#{regionController.invalidRegion}')" />
</h:selectOneMenu>
<h:panelGroup id="notInRegion">
<h:outputText class="red_bold" value="#{userController.invalidRegionMsg}" />
</h:panelGroup>
答案 0 :(得分:1)
您没有以正确的方式使用<f:ajax onevent>
。 onevent
属性应引用函数引用,不包含像onclick
和朋友那样常用的内联脚本。 <f:ajax>
将使用隐式data
参数调用函数引用三次。发送ajax请求之前的一次,ajax响应到达后的一次,以及基于ajax响应更新HTML DOM之后的一次。
以下是正确用法的启动示例:
function functionName(data) {
var status = data.status; // Can be "begin", "complete" or "success".
var source = data.source; // The parent HTML DOM element.
switch (status) {
case "begin": // Before the ajax request is sent.
// ...
break;
case "complete": // After the ajax response is arrived.
// ...
break;
case "success": // After update of HTML DOM based on ajax response.
// ...
break;
}
}
声明如下:
<f:ajax ... onevent="functionName" />
在您的特定情况中,您可能需要以下方法:
function renderRegionMsg(data) {
if (data.status == "success") {
var val = data.source.value;
if (val === "true") {
alert("true");
document.getElementById("NavForm:regionform:notInRegion").style.visibility = "";
}
else {
alert("false");
document.getElementById("NavForm:regionform:notInRegion").style.visibility = "hidden";
}
}
}
与
<f:ajax ... onevent="renderRegionMsg" />