2013-04-09 14 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"); 
    }); 
}); 

To działa dobrze i kaskad na Dropdowns w odpowiedniej kolejności, ale firefox debugger pokazuje błąd i np generuje alarm i pyta, czy Id liek do debugowania .JavaScript funkcja zwrotna wyrzuca błąd „Callback nie jest funkcją” w Firefox

Wszelkie porady byłoby świetnie

+0

'zwrotna nie jest zdefiniowane w ten zakres ". Zmień 'var callback' na' window.callback' i sprawdź, czy działa. – Jashwant

+0

@Jashwant Nie ma nic wspólnego z lunetą. – epascarello

Odpowiedz

34

To dlatego, że nie zawsze są minięciu oddzwanianie do tej metody.

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

Dzięki, powinienem to sobie uświadomić! – DavidB

20

To dlatego, że nie zawsze zapewniając callback do funkcji CascadeDropDowns.

E.g.

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

Należy zmodyfikować funkcję traktować argument callback jako optionnal argumentu:

if (callback) { 
    callback(); 
} 

Typowym skrótem czyli:

callback && callback(); 
+1

Dzięki za skrót! – Edgar