1

現在、ドロップダウン ボックスに入力するデータベース呼び出しを返そうとしています。ただし、返されたリストを循環しようとすると、「コールバックは未定義です」というエラーが発生します。このコードを 2 つの方法で試しましたが、どちらも機能しません。

私はもう試した:

$('#Vehicle_KovId_value').change(function () {
        var kovID = $(this).val();
        var drop2 = $('#Vehicle_BodyStyle_value');
        if (kovID != null && kovID != '') {
            drop2.get(0).options.length = 0;
            drop2.get(0).options[0] = new Option('Please Select One', '-1');
            $.ajax({
                type: "GET",
                url: '/Ajax/Index',
                async: false,
                data: { KovID: kovID },
                contentType: "application/object; charset=utf-8",
                success: function (record) {
                    drop2.get(0).options.length = 0;
                    drop2.get(0).options[0] = new Option("Please Select One", "-1");
                    $.each(function (index, item) {
                    drop2.get(0).options[drop2.get(0).options.length] = new Option(item.Display, item.Value);
                    });
                },
                error: function () {
                    $('#Vehicle_BodyStyle_value').get(0).options.length = 0;
                    $('#Vehicle_BodyStyle_value').get(0).options[0] = new Option("Error!", "-1");
                    alert("Failed to load styles");
                }
            });
        }
    });

私も試しました:

$('#Vehicle_KovId_value').change(function () {
        var kovID = $(this).val();
        var drop2 = $('#Vehicle_BodyStyle_value');
        if (kovID != null && kovID != '') {
            drop2.get(0).options.length = 0;
            drop2.get(0).options[0] = new Option('Please Select One', '-1');
            $.ajax({
                type: "GET",
                url: '/Ajax/Index',
                async: false,
                data: { KovID: kovID },
                contentType: "application/object; charset=utf-8",
                success: function (record) {
                    drop2.get(0).options.length = 0;
                    drop2.get(0).options[0] = new Option("Please Select One", "-1");
                    fillBStyles(record);
                    //                    $.each(function (index, item) {
                    //                        drop2.get(0).options[drop2.get(0).options.length] = new Option(item.Display, item.Value);
                    //                    });
                },
                error: function () {
                    $('#Vehicle_BodyStyle_value').get(0).options.length = 0;
                    $('#Vehicle_BodyStyle_value').get(0).options[0] = new Option("Error!", "-1");
                    alert("Failed to load styles");
                }
            });
        }
    });

    function fillBStyles(r) {
        var drop2 = $('#Vehicle_BodyStyle_value');
        $.each(function (index, item) {
            drop2.get(0).options[drop2.get(0).options.length] = new Option(item.Display, item.Value);
        });

    }

どちらも私にエラーを与えます:

TypeError: コールバックが定義されていません

返されるデータ オブジェクトrecordは、データベース オブジェクトのリストであり、そこから 2 つの部分を取得する必要があります。

この「コールバック」エラーを修正して、関数でデータを使用できるようにするにはどうすればよいですか?

4

3 に答える 3

1

コールバックは、前の関数が操作を完了して値を返した直後に実行される関数です。この場合、成功と失敗の 2 つのコールバックがあります。

関数宣言はブロック内 (if/else/for クロージャー) では許可されません。つまり、コールバック関数 (ajax クロージャー内で宣言する)function (record) { }は、クロージャー内にあるため、その場所に配置できませんif (kovID != null && kovID != '') { }

幸いなことに、簡単な修正方法があります。次のように、if ステートメントの外側で成功コールバック関数を宣言します (それ自体をグローバル スコープに入れます)。

function ajaxSuccess(record) {
                drop2.get(0).options.length = 0;
                drop2.get(0).options[0] = new Option("Please Select One", "-1");
                $.each(function (index, item) {
                drop2.get(0).options[drop2.get(0).options.length] = new Option(item.Display, item.Value);
                });
            }
// ...do other javascript stuff

次のように成功関数を呼び出します。

$.ajax({
            type: "GET",
            url: '/Ajax/Index',
            async: false,
            data: { KovID: kovID },
            contentType: "application/object; charset=utf-8",
            success: ajaxSuccess
//...blah blah blah
于 2013-10-07T20:34:46.813 に答える
1

$.each正しく使っていないと思います。docsの例を見てください。あなたが使用している方法は、jQueryセレクターで使用すると機能しますが、.each()それを$直接使用しています。つまり、反復するものを何も提供していません。あなたのコードを見てください:

$.each(function (index, item) {
    drop2.get(0).options[drop2.get(0).options.length] = new Option(item.Display, item.Value);
});

この繰り返しは何ですか?それぞれについて、この関数は何を実行しますか? あなたはこれを意味しているかもしれません:

$('someSelector').each(function (index, item) {
    drop2.get(0).options[drop2.get(0).options.length] = new Option(item.Display, item.Value);
});

またはこれ:

$.each(someArray, function (index, item) {
    drop2.get(0).options[drop2.get(0).options.length] = new Option(item.Display, item.Value);
});

.each()いずれにせよ、反復するコレクションを提供する必要があります。エラーから、後者のケースがデフォルトになっていると思いますが、使用法に2番目の引数がないため、callbackに提供されていません$.each()

于 2013-10-07T20:40:00.003 に答える
0

あなたの

function fillBStyles(r) {
        var drop2 = $('#Vehicle_BodyStyle_value');
        $.each(function (index, item) {
            drop2.get(0).options[drop2.get(0).options.length] = new Option(item.Display, item.Value);
        });

    }

他の機能の上。

|| を使用します。vs && if (kovID != null && kovID != '')

なぜ&&が必要なのですか? kovIDはどちらとも等しくありませんが、&&は両方の要件を満たす必要があることを意味します。

于 2013-10-07T20:29:48.583 に答える