2013-04-09 44 views
14
function CascadeDropDowns(parentClass, childClass, action, callback) { 
    var DropDownId = $(parentClass + " option:selected").val(); 

    $.ajax({ 
    url: "/site/" + action, 
    data: { DropDownId: DropDownId }, 
    dataType: "json", 
    type: "POST", 
    error: function() { 
     alert("An error occurred."); 
    }, 
    success: function (data) { 
     var items = ""; 
     $.each(data, function (i, item) { 
     items += "<option value=\"" + item.Value + "\">" + item.Text + "</option>"; 
     }); 
     $(childClass).html(items); 
     $(childClass)[0].selectedIndex = 0; 
     callback(); 
    } 
    }); 
} 

$(document).ready(function() { 
    // Populates all child drop downs on load 
    var callback = function() { 
    CascadeDropDowns(".ConfigGroupDDL", ".ConfigNameDDL", "GetParameters"); 
    }; 

    CascadeDropDowns(".DeviceTypeDDL", ".ConfigGroupDDL", "GetGroups", callback); 

    // Populates all child drop downs parent change 
    $(".DeviceTypeDDL").change(function() { 
    var callback = function() { 
     CascadeDropDowns(".ConfigGroupDDL", ".ConfigNameDDL", "GetParameters"); 
    }; 
    CascadeDropDowns(".DeviceTypeDDL", ".ConfigGroupDDL", "GetGroups", callback); 
    }); 
    $(".ConfigGroupDDL").change(function() { 
    CascadeDropDowns(".ConfigGroupDDL", ".ConfigNameDDL", "GetParameters"); 
    }); 
}); 

Điều này chạy tốt và xếp thứ tự thả xuống theo đúng thứ tự, nhưng trình gỡ lỗi firefox hiển thị lỗi và tức là ném cảnh báo và hỏi xem Id có lừa dối không .Chức năng gọi lại Javascript sẽ báo lỗi "Gọi lại không phải là một chức năng" trong firefox

Mọi lời khuyên sẽ tuyệt vời

+0

'gọi lại không được định nghĩa trong phạm vi đó'. Thay đổi 'var callback' thành' window.callback' và xem nó có hoạt động không. – Jashwant

+0

@Jashwant Không có gì để làm với phạm vi. – epascarello

Trả lời

34

Đó là vì bạn không phải lúc nào cũng chuyển cuộc gọi lại vào phương thức đó.

success: function (data) { 
    var items = ""; 
    $.each(data, function (i, item) { 
    items += "<option value=\"" + item.Value + "\">" + item.Text + "</option>"; 
    }); 
    $(childClass).html(items); 
    $(childClass)[0].selectedIndex = 0; 
    if(callback) callback(); //check before calling it. 
} 
+1

Cảm ơn, tôi nên nhận ra điều đó! – DavidB

20

Đó là bởi vì bạn không phải luôn luôn cung cấp một callback đến CascadeDropDowns chức năng.

Ví dụ:

CascadeDropDowns(".ConfigGroupDDL", ".ConfigNameDDL", "GetParameters");

Bạn nên thay đổi chức năng của bạn để điều trị đối số callback như một cuộc tranh cãi optionnal:

if (callback) { 
    callback(); 
} 

Một viết tắt phổ biến cho điều đó là:

callback && callback(); 
+1

Cảm ơn vì đã viết tắt !! – Edgar

Các vấn đề liên quan