Каскадные выпадающие списки, неоднократно населенные

У меня есть три уровня каскадного выпадающего

Заказчик> Проект> Задача

Когда я выбираю клиента, я просто хочу выбрать проекты клиентов

Когда я выбираю проект, я просто хочу выбрать задачи этого проекта

У меня есть проект> задача (уровень 2 до 3) работает нормально

Но когда я выбираю Customer, он заполняет Project OK, но затем повторно заполняет Task для каждого проекта. Таким образом, он выбирает правильные задачи, но если есть 3 проекта выше, он будет заполнять эти задачи 3 раза

Поэтому, когда я выбираю Заказчика А, он правильно заполняет Проект 1, 2, 3 и выбирает Проект 1 как заданный по умолчанию.

Но затем, предполагая, что у Проекта 1 есть Задача 1 и Задача 2, раскрывающийся список Задач заканчивается:

Задача 1 Задача 2 Задача 1 Задача 2

Я понимаю, почему это происходит, но я не знаю, как это остановить. Я думаю, что мне нужно, чтобы мой.append не вызвал событие изменения

Даже тогда это не имеет смысла, потому что все равно надо его очистить

Вот мой Javascript:

/*
    This java script is for CREATE and EDIT popup dialogs on the Task Index page
    - Manage cascading drop downs (Client > Project, Project > Task)
    - Synchronise check box with hidden field
*/



$(document).ready(function () {
    //When Customer is changed reload Project
    // Project function reloads project tasks
    $("#Customer_ID").change(
        function () {
            // refresh projects
            refreshProjectFromClient();
        }
        )

    // When project is changed reload task
    $("#CustomerProject_ID").change(
        function () {
            refreshProjectTaskFromProject();
        }
        )

    // When chargeable is changed sync the hidden field
    // A change in a checkbox called MyCheckBox_CB 
    // will be reflected in a hidden field called MyCheckBox
    $(":checkbox").change(
        function () {
            $("#" + this.name.replace("_CB", "")).val((this.checked ? 1 : 0));
        }
        )
})





// This is called when the customer combo changes
// It reloads the project combo with the customers active projects
function refreshProjectFromClient() {
    // clear drop down
    $("#CustomerProject_ID").empty();

    // Get new project dataset via ajax based on customer and populate drop down
    $.ajax({
        type: 'POST',
        //url: '@Url.Action("GetProjects")',
        url: window.location.toString() + '/GetProjects',
        dataType: 'json',
        data: { CustomerID: $("#Customer_ID").val() },
        // success is called when dataset returns
        success: function (p) {
            // Populate with each returned member
            $.each(p, function (i, pr) {
                // is this append triggering the task onchange?
                $("#CustomerProject_ID").append(
                    '<option value="' + pr.Value + '">' +
                    pr.Text + '</option>'
                    )
                // now that it's loaded, load the project tasks
                refreshProjectTaskFromProject();
            })
        }
    });
}


function refreshProjectTaskFromProject() {
    $("#CustomerProjectTask_ID").empty();

    // Get new tasks dataset via ajax based on project and populate drop down
    $.ajax({
        type: 'POST',
        url: window.location.toString() + '/GetProjectTasks',
        dataType: 'json',
        data: { ProjectID: $("#CustomerProject_ID").val() },
        // success is called when dataset returns
        success: function (t) {
            // Populate with each returned member
            $.each(t, function (i, ta) {
                $("#CustomerProjectTask_ID").append(
                    '<option value="' + ta.Value + '">' +
                    ta.Text + '</option>'
                    );
            })
        }
    });
}

1 ответ

Решение

refreshProjectTaskFromProject() вызывается из с помощью $.each. Это должно быть за пределами этого цикла.

Изменить: О, и вы пропустите точку с запятой после добавления ().

Другие вопросы по тегам