1

我目前正在尝试返回数据库调用以填充下拉框。但是,当我循环浏览返回的列表时,我收到“回调未定义”错误。我已经以两种方式尝试了这段代码,但都没有奏效。

我试过了:

$('#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是一个数据库对象列表,我必须从中提取两部分。

如何修复此“回调”错误,以便我可以在我的函数中使用我的数据?

4

3 回答 3

1

回调是在其前身完成其操作并返回值后立即执行的函数。在这种情况下,您有两个回调,成功和失败。

块内不允许函数声明(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正确使用。查看文档中的示例。如果与 jQuery 选择器一起使用,您使用它的方式会起作用,但您直接使用的是.each()that's on $。这意味着您没有向它提供任何可以迭代的东西。看看你的代码:

$.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()一个用于迭代的集合。我想象它默认为后一种情况的错误,但是由于您的使用中没有第二个参数,所以没有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 回答