2012-05-02 96 views
0

我有2個JS文件,其中一個包含一個名爲「form.js」的多個文件之間共享的泛型函數列表,另一個特定於我的CMS上的某個頁面, blog.form.js」。Ajax響應返回,說明它的屬性值未定義

內部 「form.js」,我有一個通用的JS功能,可每當我要求從數據庫中加載的記錄的jQuery.ajax()請求:

function load_record(field_id, class_name, entity_type) { 

// Send ajax request to load the record, and enable the form's state once the record's content has been received. 
var response = $.ajax({ 
    async: false, 
    dataType: "json", 
    data: { 
     action: "load_"+entity_type, 
     id: $("#"+field_id+"_list").val() 
    }, 
    success: function(response) { 
     // Make visible the buttons to allow actions on record, such as deleting or renaming. 
     $("#"+field_id+"_actions").show(); 

     // Make visible the container of all form elements related to the record. 
     $("#"+field_id+"_form_inputs").show(); 

     // Must return response so the calling JS file can use the values returned to 
     // populate the form inputs associated with the record that's just been loaded 
     // with the correct values. 
     return response; 
    }, 
    type: "post", 
    url: "/ajax/record/"+class_name 
}); 
alert(response.link + " " + response + " " + response.responseText); 
return response; 

}

內部「blog.form.js」,我有函數調用,當我選擇一個數據庫記錄,從包含它們的列表的菜單加載:

// Select a link for editing. 
$("#links_list").live("change", function(){ 
    // Insert response returned from function call to load the db record into a variable. 
    // This is so the form inputs associated with the record loaded can be populated with the correct values. 
    var response = load_record('links_edit', 'blog', 'link'); 
    alert(response.link); 
    $("#links_edit_url").val(response.link);   
}); 

Ajax請求返回所需的響應。不幸的是,load_record()內部的調試警報語句「alert(response.link +」「+ response +」「+ response.responseText)」返回如下內容:undefined [Object XMLHTTPRequest] {「link」:「http:// www .url.com「}。

因此,其他函數中的調試警報語句「alert(response.link)」也會返回undefined。

XMLHTTPRequest對象已成功返回。那麼,爲什麼response.link聲明它的值是未定義的呢?

任何幫助,非常感謝。

回答

0

你完全在正確的軌道上,你可以做一個函數返回一個ajax對象。 jQuery將ajax作爲一個Deferred對象返回,因此它有額外的方法來在事實之後使用ajax響應。

$("#links_list").live("change", function(){ 
    load_record('links_edit', 'blog', 'link').done(function(response) { 
     alert(response.link); 
     $("#links_edit_url").val(response.link);  
    }); 
}); 

alert(response.link + " " + response + " " + response.responseText);load_record將回頭率,因爲它一直是,除非你把它添加到成功或進行處理。

如果您需要關於.done()確實是什麼的更多信息,請查看帶有上述鏈接的jquerys網站上的Deferreds。我希望這有幫助。

+0

這是一種享受!非常感謝你的提示+啓示。 – Bredcrumbs

0

你想要做

alert(response.link + " " + response + " " + response.responseText);

內成功的功能。你也不想

var response = $.ajax(...

你只是調用了ajax ...

$.ajax(...

阿賈克斯是異步的(除非你告訴它不要定),這意味着要求能隨時回來。嘗試使用success函數之外的響應沒有任何意義(除非您在其周圍封裝閉包或將它作爲參數傳遞)。當響應完成(成功)時觸發success,僅在該函數中將定義response

+0

因此,有沒有什麼辦法可以與其他JS文件中的函數共享在成功函數內返回的響應?這是我的問題,我有一個在文件1中的通用函數返回的響應,我需要提供給文件2中的特定函數。 – Bredcrumbs

+0

當然,只需調用該函數,並將'response'作爲參數傳遞。 – hvgotcodes

+0

哦,但問題是「blog.form.js」在泛型「form.js」文件之後被鏈接(並且需要被鏈接),所以如果我在成功函數中調用函數,那麼它是一個無效的調用該功能尚未定義。 – Bredcrumbs