2013-10-07 82 views
1

我目前正試圖返回一個數據庫調用來填充下拉框。但是,當我循環返回列表時,出現「回調未定義」錯誤。我已經嘗試了這種代碼兩種方式,都沒有工作。ajax「回調未定義」錯誤

我已經試過:

$('#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(line 654)',它讀取'if(callback.call(object [name],name,object [name])=== false){' '如果'是真的。 – Kendra

+0

您可能錯誤地使用了jQuery函數,或者將未定義的值作爲回調函數傳遞給它。如果在調試器中逐步完成此操作,那麼在jQuery拋出該錯誤之前,代碼的距離有多遠? – David

回答

1

回調函數是在其前導完成操作並返回一個值後立即執行的函數。在這種情況下,你有兩個回調,成功和失敗。

函數聲明不是塊裏面不允許(的if/else /閉包),這意味着你的回調函數(你的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 
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 & & 如果(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:在服務器端代碼中看起來像一個錯誤,看起來你在'List '上調用'.ToString()',它會生成該字符串你看到了,如果你想要實際的列表本身,它需要被序列化成JSON,如果沒有看到服務器端代碼,我不能更具體,但如果你從MVC動作返回,那麼你可以做一些像返回Json一樣的東西(someList);'而不是'return Content(someList.ToString());'我只是猜測你當前的服務器端代碼是什麼樣子的。 – David

+0

這可能是問題所在。服務器端目前正在返回一個數據庫列表,這可能是同樣的問題。我可以發佈代碼。這裏沒有人知道如何去做,所以我在這裏問。通常,我可以問我的同事如何使用某些代碼,但他們以前沒有處理過這個問題。 – Kendra