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

时间:2013-11-19 18:12:29

标签: javascript ajax jsf jsf-2

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

1 个答案:

答案 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" />