2013-10-07 7 views
1

В настоящее время я пытаюсь вернуть вызов базы данных, чтобы заполнить раскрывающийся список. Однако, когда я перехожу к циклу из возвращаемого списка, я получаю сообщение об ошибке «обратный вызов не определено». Я пробовал этот код двумя способами, и ни один из них не работает.ajax «callback is undefined» error

Я пробовал:

$('#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: callback is undefined

Объект данных возвращаемой, record, это список объектов базы данных, из которых я должен извлечь две части.

Как исправить эту ошибку «обратного вызова», чтобы я мог использовать свои данные в своей функции?

+0

Где конкретно вы получаете эту ошибку? Если это в консоли JavaScript, какая строка содержит ссылку на ошибку? Если это происходит с сервера, то это код сервера и не имеет ничего общего с этим. – David

+0

Я использую Firebug для отладки части javascript. Это говорит мне, что ошибка находится в 'jquery-1.7.js (строка 654)', которая читает 'if (callback.call (object [name], name, object [name]) === false) {' затем ломается, если это 'if' истинно. – Kendra

+0

Скорее всего, вы используете функцию jQuery неправильно или передаете это неопределенное значение в качестве функции обратного вызова. Если вы пройдете через это в отладчике, насколько далеко ваш код до того, как jQuery выбрасывает эту ошибку? – David

ответ

1

Обратный вызов - это функция, которая должна быть выполнена сразу же после того, как ее предшественник завершит свою работу и вернет значение. В этом случае у вас есть два обратных вызова, успех и сбой.

Объявление функций не допускается внутри блоков (если/else/для замыканий), что означает вашу функцию обратного вызова (которую вы объявляете внутри вашего закрытия ajax) function (record) { } не может быть размещен там, где он находится, так как он находится внутри вашего замка 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 

и вызвать функцию успеха так:

$.ajax({ 
      type: "GET", 
      url: '/Ajax/Index', 
      async: false, 
      data: { KovID: kovID }, 
      contentType: "application/object; charset=utf-8", 
      success: ajaxSuccess 
//...blah blah blah 
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); 
     }); 

    } 

над другой функции.

а затем использовать || против & & если (Kovid! = NULL & & Kovid! = '')

Зачем вам нужен & &, Kovid не будет равна ни одной, но & & означает, что она должна соответствовать обоим требованиям.

+0

&& на тот случай, если кто-то установит первую снизу вниз по умолчанию, которая имеет значение по умолчанию из '' "'. – Kendra

+0

Я просто попробовал это, но это не исправить. Спасибо за предложение, хотя! – Kendra

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().

+0

Это, в сочетании с ответом от @Mike Hometchko, помогло туда, где вторая выпадающая – Kendra

+0

@Kendra: Это выглядит как ошибка в серверном коде. Похоже, вы вызываете '.ToString()' в 'List ', который будет генерировать эту строку вы видите. Если вы хотите сам фактический список, его нужно сериализовать в JSON. Не видя код на стороне сервера, я не могу быть более конкретным, но если вы возвращаетесь из действия MVC, вы можете сделать что-то вроде 'return Json (someList); 'вместо' return Content (someList.ToString()); 'Я только предполагаю, что выглядит ваш текущий код на стороне сервера. – David

+0

Это может быть проблемой. Серверная сторона в настоящее время возвращает список базы данных, что может быть одной и той же проблемой. Я могу опубликовать код для этого. Никто здесь не знает, как это сделать, поэтому почему я здесь спрашиваю. Обычно я могу спросить своих сотрудников, как работать с определенным кодом, но они не рассматривали это раньше. – Kendra