1

フォームが 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 のバイブルJS Fixをチェックしていますが、成功していません。

私は似たような動作をかなり頻繁に見てきました (そして回避策を見つけなければなりませんでした) ので、根本的なことを誤解している可能性があります。

ああ、はい、何度もチェックしました。コードにネストされたフォームはありません。

4

1 に答える 1

1

あなたが見つけたJS修正はフックであり、カバーの下でjQueryを使用するPrimeFacesコンポーネントではなく、によってjsf.ajax.addOnEventのみトリガーされます。<f:ajax>

PrimeFaces の ajax リクエストにも対応するには、現在のバージョンのJS 修正プログラムを入手し (最近その投稿を更新しました)、以下を追加して、この修正を 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);
    }
}

免責事項:特定のユースケースは試していません。しかし、理論的には、それはあなたの問題を解決するはずです。

于 2013-09-13T14:16:52.407 に答える