ajax“回调未定义”错误

时间:2013-10-07 20:21:32

标签: jquery ajax callback

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

我试过了:

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

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

3 个答案:

答案 0 :(得分:1)

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

块内部不允许使用函数声明(if / else / for closures)这意味着你的回调函数(你在ajax闭包中声明)function (record) { }不能放在它所在的位置,因为它在你的{{{ 1}}封闭。

幸运的是,有一个简单的解决方法:在if语句之外声明你的成功回调函数(把它放在全局范围内),如下所示:

if (kovID != null && kovID != '') { }

并像这样调用成功函数:

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

答案 1 :(得分:1)

我认为您没有正确使用$.each。看看the 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()提供一个要迭代的集合。我错误地认为它违反了后一种情况,但由于你的使用中没有第二个参数,因此callback没有提供$.each()

答案 2 :(得分: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不等于任何一个,而且&&意味着它必须满足这两个要求。