Primefaces Ajax更新表单不会触发commandButton操作

时间:2013-09-13 13:30:58

标签: ajax jsf primefaces

我有一个表单没有触发其commandButton操作方法的问题。 当我在没有事先更新的情况下提交表单时(不选择树中的任何节点),该方法触发就好了。

只要表单经过Ajax更新,commandButton就不再调用它的动作了。

这是JSF代码:

<p:layoutUnit position="center">
    <p:tree orientation="horizontal" value="#{flightTypeController.tree}" var="node"
        selectionMode="single" selection="#{flightTypeController.selectedNode}">
        <p:ajax event="select" listener="#{flightTypeController.onNodeSelect}" update=":typesTree"/>

        <p:treeNode>
            <h:outputText value="#{node.name}"/>
        </p:treeNode>
    </p:tree>

    <h:form id="typesTree">
        <p:inputText disabled="true" id="outputParent" value="#{flightTypeController.selectedOne.name}"/>
        <p:inputText id="outputName" value="#{flightTypeController.current.name}"/>


        <p:commandButton ajax="false" icon="ui-icon-disk" value="#{bundle.general_create}" action="#{flightTypeController.create()}"/>
    </h:form>
</p:layoutUnit>

java监听器:

public void onNodeSelect(final NodeSelectEvent event) {
    final Object res = event.getTreeNode().getData();
    if (res instanceof FlightType) {
        selectedOne = (FlightType) res;
    } else {
        selectedOne = null;
    }
}

我已经检查了BalusC的bibleJS Fix,但没有成功。

我经常看到类似的行为(并且必须找到解决方法)所以我可能误解了一些基本的东西。

哦,是的,我多次检查过:我的代码中没有嵌套的表单。

1 个答案:

答案 0 :(得分:1)

您找到的JS fix挂钩jsf.ajax.addOnEvent仅由<f:ajax>触发,而不是由使用jQuery的PrimeFaces组件触发。

要覆盖PrimeFaces ajax请求,请抓取JS fix的当前版本(我最近更新了该帖子)并添加以下内容以便在jQuery ajax请求中应用此修复:

$(document).ajaxComplete(function(event, xhr, options) {
    if (typeof xhr.responseXML != 'undefined') { // It's undefined when plain $.ajax(), $.get(), etc is used instead of PrimeFaces ajax.
        fixViewState(xhr.responseXML);
    }
}

免责声明:我没有尝试过您的具体用例。但是,从理论上讲,它应该可以解决你的问题。