使用f:ajax-onevent时不更新布尔值

Boolean value not updating when using f:ajax onevent

本文关键字:更新 布尔值 ajax-onevent 使用      更新时间:2023-09-26

当选择一个选项时,它会触发控制器中的方法调用,从而更改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>

您使用<f:ajax onevent>的方式不对。onevent属性应该引用函数引用,而不是像通常在onclick和friends上使用的那样包含内联脚本。<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" />