0

コードが示すように、ネストされたテーブルがいくつかあります。ユーザーがチェックボックスをクリックすると、ajax 呼び出しがサーバーに送信され、クライアントに返されます。サーバー内のプロセスが正常に動作している場合、クリックされた操作行は、コールバックを取得するときに jquery を使用して HTML コードから削除されます。次に、ユーザーが同じ操作テーブルの別の行を削除しようとすると、サーバーに送信される値が正しくありません。この呼び出しは、次の行の値を送信します: #{trade.murexId}、#{operation.id}、および #{operation.operation} ですが、正しい値ではありません。Javascript と jquery のコールバック関数は正常に動作しています。Mojarraの最新バージョンを使用しています。なぜこれが起こったのですか?どうすれば解決できますか?

HTML:

    <table id="trades">
        <th class="image_cell"></th>
        <th>Murex Id</th>
        <th>Type</th>
        <th>Portfolio</th>
        <th>Log</th>
            <ui:repeat var="trade" value="#{controller.errorTrades}">
                <h:form>
                    <tr class="trade error">

                            <td class="image_cell error"><h:graphicImage styleClass="expandable" url="resources/images/plus.png"></h:graphicImage></td>
                            <td id="murex_id" class="error">#{trade.murexId}</td>
                            <td id="type" class="error">#{trade.type}</td>
                            <td class="error">#{trade.portfolio}</td>
                            <td class="error">
                                <h:commandButton image="resources/images/log_big.jpg" action="#{controller.onLogTrade(trade.murexId)}">
                                    <f:ajax render="log_big" />
                                </h:commandButton>
                                <h:panelGroup id="log_big">
                                    <h:outputScript  rendered="#{not empty controller.result}">
                                        onLogProcess("#{controller.result}");
                                    </h:outputScript>
                                </h:panelGroup>
                            </td>
                    </tr>
                    <tr class="operations">
                        <td id="#{trade.murexId}" class="operation_row" colspan="5">
                            <table id="operations">
                                <tr class="header">
                                    <th class="empty_cell"></th>
                                    <th class="operation_cell">Operation</th>
                                    <th>Murex Status</th>
                                    <th>GBO Status</th>
                                    <th>GBO Id</th>
                                    <th>OPICS Id</th>
                                    <th>Time Transaction</th>
                                    <th>Comment</th>
                                    <th id="delete">Delete</th>
                                    <th>Log</th>
                                </tr>
                                <ui:repeat var="operation" value="#{trade.operationsSortDescList}" varStatus="status">
                                    <tr class="operation">
                                        <th class="empty_cell"></th>
                                        <td id="operation" class="operation_cell color">#{operation.operation}</td>
                                        <td class="color">#{operation.statusMurex}</td>
                                        <td id="status_gbo" class="color">#{operation.statusGbo}</td>
                                        <td id="gbo_id" class="color">#{operation.gboId}</td>
                                        <td id="opics_id" class="color">#{operation.opicsId}</td>
                                        <td class="color">#{operation.datetimeToString}</td>
                                        <td class="color">#{operation.coment}</td>
                                        <td class="color checkbox">
                                            <h:selectBooleanCheckbox>
                                                <f:ajax execute="@form" event="click" listener="#{controller.onDelete}" onevent="onDeleteProcess" />
                                                <f:attribute name="murexId" value="#{trade.murexId}" />
                                                <f:attribute name="operationId" value="#{operation.id}" />
                                                <f:attribute name="operation" value="#{operation.operation}" />
                                            </h:selectBooleanCheckbox> 
                                        </td>
                                        <td class="color log">
                                            <h:commandButton image="resources/images/log_small.jpg" action="#{controller.onLogOperation(operation)}">
                                                <f:ajax execute="@form" render="small_log" />
                                            </h:commandButton>
                                            <h:panelGroup id="small_log">
                                                <h:outputScript  rendered="#{not empty controller.result}">
                                                    onLogProcess("#{controller.result}");
                                                </h:outputScript>
                                            </h:panelGroup>
                                        </td>
                                    </tr>
                                </ui:repeat>
                            </table>
                        </td>
                    </tr>
                </h:form>
            </ui:repeat>
   </table>

前もって感謝します!

再編集:

h:selectBooleanCheckbox を h:commandButton に変更しました。

意見:

                            <table id="operations">
                                <tr class="header">
                                    <th class="empty_cell"></th>
                                    <th class="operation_cell">Operation</th>
                                    <th>Murex Status</th>
                                    <th>GBO Status</th>
                                    <th>GBO Id</th>
                                    <th>OPICS Id</th>
                                    <th>Time Transaction</th>
                                    <th>Comment</th>
                                    <th id="delete">Delete</th>
                                    <th>Log</th>
                                </tr>
                                <ui:repeat var="operation" value="#{trade.operationsSortDescList}" varStatus="status">
                                    <tr class="operation">
                                        <th class="empty_cell"></th>
                                        <td id="operation" class="operation_cell color">#{operation.operation}</td>
                                        <td class="color">#{operation.statusMurex}</td>
                                        <td id="status_gbo" class="color">#{operation.statusGbo}</td>
                                        <td id="gbo_id" class="color">#{operation.gboId}</td>
                                        <td id="opics_id" class="color">#{operation.opicsId}</td>
                                        <td class="color">#{operation.datetimeToString}</td>
                                        <td class="color">#{operation.coment}</td>
                                        <td class="color checkbox">
                                            <h:commandButton image="resources/images/log_small.jpg" action="#{controller.onDelete(operation)}">
                                                <f:ajax execute="@form" render="small_log" onevent="onDeleteProcess" />
                                            </h:commandButton>
                                        </td>
                                        <td class="color log">
                                            <h:commandButton image="resources/images/log_small.jpg" action="#{controller.onLogOperation(operation)}">
                                                <f:ajax execute="@form" render="small_log" />
                                            </h:commandButton>
                                            <h:panelGroup id="small_log">
                                                <h:outputScript  rendered="#{not empty controller.result}">
                                                    onLogProcess("#{controller.result}");
                                                </h:outputScript>
                                            </h:panelGroup>
                                        </td>
                                    </tr>
                                </ui:repeat>
                            </table>

コントローラ:

public void onDelete(Operation operation) 
{
    Trade trade = operation.getTrade();
    Boolean result = false;

try {
    if (trade.getOperations().size() == 1) {
        result = Modelo.deleteTrade(trade);
        if (result)
            this.trades.remove(trade);
    } else {
        result = Modelo.deleteOperation(operation);
        if (result)
            trade.getOperations().remove(operation);
    }          
} catch(Exception ex) {
    ConfigUtil.LOGGER.error(ex);
}       

}

操作を削除すると、それが問題になります。いいえ、jquery のためです。私はそれをテストしたので、私はそれについて確信しています。オペレーションを削除して次のオペレーションをクリックすると、間違ったオペレーションがサーバーに送信されます。なぜこれが起こっているのですか?

ありがとう!

4

2 に答える 2

2

まずdatatable、raw html table の代わりに使用することをお勧めします。Datatable はどのような方法でも同様の html を生成しますが、サーバー コンポーネント ツリーにアクセスできるという利点があります。

実際に使用する必要はありませんが、必要に応じて使用jQueryできるため、これに任せますが、その場合は変更を使用します

<table id="trades">

<table id="trades" jsfc="h:dataTable binding="#{controller.dataTable}">

hJSF html タグ lib の名前空間参照であ​​ると仮定します。

マネージド Bean で、どの継ぎ目を にするかを宣言private javax.faces.component.html.HtmlDataTable dataTable ;しますcontroller

コードでは、listener="#{controller.onDelete}"戻る前にサーバー側からそれを削除する必要があります。


これは達成されますが、ハッキーに見えます.使用しない方が良いですjQuery.データテーブルを再レンダリングするだけで、他のオプションよりも高価ではありません


このリンクが役立つ場合があります。

于 2012-04-04T06:31:16.320 に答える
0

これはおそらく、サーバー側が知らないうちにビュー内の要素を変更しているためです。DOM を変更するために JQuery を直接使用するのではなく、代わりに JSF2 Ajax 機能を使用して、属性renderrerender属性を使用してください。

この質問への回答を参照してください

于 2012-04-04T01:38:11.710 に答える