1

jqGrid の列の 1 つでフォーマッタを使用しています。フォーマッタはいくつかのロジックを使用して何を表示するかを決定し、場合によっては ajax メソッドを呼び出します。Fiddler で、適切なデータが ajax 呼び出しから返されることを確認しました。また、変数が適切に設定されていることを Chrome デバッグ ツールで確認しました。ただし、シーケンスはすべてソートされていないため、私の列の戻り値は「未定義」です。デバッグ ツールのタイムラインで、jqgrid が既に読み込まれた後に getJSON 呼び出しが呼び出されていることがわかります。

私はこれを最初に試しました:

function myFormatter(cellvalue, options, rowObject) 
{
    if (rowObject[0] == something) {
        $.getJSON('@Url.Action("MyAction", "MyController"), function (myResult) {
            var myObject = myResult[0];
            return myObject.myID;
        });
    }
    else {
        return "";
    }
}

また、async=false を使用して ajax 呼び出しを使用してみました。また、type と dataType に異なる値を試しましたが、結果はすべて同じです。

function myFormatter(cellvalue, options, rowObject) 
{
    if (rowObject[0] == something) {
        $.ajax({
            type: 'POST',
            url: '@Url.Action("MyAction", "MyController"),
            async: false,
            success: (function(result) {
                var myObject = myResult[0];
                return myObject.myID;
            })
        });        
    }
    else {
        return "";
    }
}
4

1 に答える 1

2

同期 AJAX 呼び出しとクロージャーを使用して、これを機能させることができるはずです。

function myFormatter(cellvalue, options, rowObject) 
{
    var value = "";

    if (rowObject[0] == something) {
        $.ajax({
            type: 'POST',
            url: '@Url.Action("MyAction", "MyController"),
            async: false,
            success: (function(result) {
                var myObject = myResult[0];
                value = myObject.myID;
            })
        });        
    }

    return value;
}

ただし、一般に、同期 AJAX 呼び出しを使用することはお勧めできません。これは、不確定な時間 UI をブロックする可能性があるためです。行ごとに 1 つの AJAX 呼び出しが行われるため、グリッドに多数の行がある場合、このケースは特に問題になる可能性があります。

可能であれば、ID を事前に取得してページ上でローカルにキャッシュするか、サーバー側で書式設定を行うことをお勧めします。いつものように、最善の判断をしてください。

于 2012-09-21T13:59:02.287 に答える