11

フォーラムで質問するのはこれが初めてです。通常、私の質問は既に質問され、回答されています。私にとってうまくいくこの問題に対する答えが見つからなかったので、ここに行きます:

次のように、JSF 2.0 で Ajax 呼び出しを行っています。

< f :ajax listener="#{myReferenceController.clearRequiredReferenceNumber}"
    onevent="resetFocus" execute="@form"
    render=":resultsForm:ResultsDisplay" />

リスナー内のすべてが完全に機能し、.xhtml ページにあるデータ テーブルで期待どおりにデータがレンダリングされます。問題は、私が呼び出す Javascript がoneventレンダリングが完了する前に呼び出されているように見えるため、私の列にフォーカスをリセットするプロセスがdatatable機能しないdatatableことです。 Ajax の再レンダリングが終了したときの DOM。

この時点でレンダリングが完了していることを期待して、Javascript で「成功」のステータスを調べています。残念ながら、これは事実ではなく、私のgetElementById(実際にはdojo.byId)データテーブル内の要素が見つかりません。Ajax呼び出しがない状況でこの同じ関数を呼び出しているため、JavaScript関数が通常の状況で機能することはわかっており、すべてがそこで完全に機能します。

フォーカスを設定しようとしているテーブル内のセルのレンダリングを回避できれば、それは素晴らしいことですが、リスナーは ajax 呼び出しでこのセルに変更を加えています。私は機知に富んでいるので、これに関するアイデアは大歓迎です。

-- Balusc への返信 (ところで、あなたについて良いことを聞きました)

うーん、私は実際には正しい軌道に乗っていたと思いますが、まだ問題が発生しているようです. 「成功」を確認していますが、まだ成功していても、ここに焦点を合わせることができません。「成功」をチェックしている私の Javascript 関数は次のとおりです。この関数は、Ajax イベントに関連付けられていない別の状況で機能します。

function resetFocus(data) {
    var theRow = dojo.byId("resultsForm:selectedRow").value;               
    if (data.status == "success") {
        dojo.query('[widgetId]',dojo.byId('theResultsDataTable'))
            .forEach(function(node) {
                var widget = dijit.byNode(node);
                var theId = widget.attr("id")                                             
                if (theId.indexOf(':' + theRow + ':') != -1) {
                    if (theId.indexOf('theOrppoNum') != -1) {
                        widget.focus();
                        widget.attr("isFocused",true);
                    }
                }
            });
    }
}
4

1 に答える 1

24

属性に関連付けられた関数は、onevent実際には3回呼び出されます。ajax リクエストが送信される前に 1 回、ajax レスポンスが到着した後に 1 回、HTML DOM が正常に更新されたときに 1 回。statusそのために、指定されたデータ引数のプロパティをチェックする必要があります。

function onEventFunction(data) {
    var status = data.status; // Can be "begin", "complete" or "success".

    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;
    }
}

したがって、特定のケースでは、ステータスが であるかどうかのチェックを追加するだけですsuccess

function resetFocus(data) {
    if (data.status == "success") {
        // Do your job here.
    }
}
于 2012-07-05T19:29:02.780 に答える