从闭包范围将变量传递给getJSON jQuery函数

时间:2012-10-29 23:09:48

标签: jquery json scope

我正在尝试将相同的 jQuery JSON ASP.NET MVC3方法附加到两个不同的<select>元素:

<select id="StartYear">
<option value="">Select Year</option>
<option value="2000">2000</option>
<option value="2001">2001</option>
</select>

<select id="StartMonth">
<option value="">Select Month</option>
</select>

同样适用于具有ID “EndYear”“EndMonth”<select>元素。

我想在“Start Year”和“End Year”中附加相同的jQuery函数:

$('[id$="Year"]').change(function () {
        var selectedYear = $(this).val();
        var selectedId = $(this).attr('id')
        if (selectedYear != null && selectedYear != '') {
            $.getJSON('@Url.Action("Months")', { year: selectedYear }, function (months) {
                var monthsSelect = $('#StartMonth');
                if (selectedId == 'EndYear') {
                    monthsSelect = $('#EndMonth');
                }
                monthsSelect.empty();
                daysSelect.prepend("<option text='-- select month --' value='' selected='selected'></option>");
                $.each(months, function (index, month) {
                    monthsSelect.append($('<option/>', {
                        value: month.value,
                        text: month.text
                    }));
                });
            });
        }
    });

但是,此代码不起作用。我用Bugzilla调试它,我发现这个条件(selectedId == 'EndYear')打破了这个功能。变量selectedId在闭包范围内,但我不知道如何将它放在函数范围内。否则我不知道它是什么原因。 请记住,没有这个条件,代码正在运行(当然只是#StartMonth)

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,可以在selectedId的成功处理程序中访问变量$.getJSON,但变量的值可能已被另一个change事件更改。

例如,如果两个change事件将在短时间间隔内声明,例如“#EndYear”和“#StartYear”,那么可能是以下

  1. change将触发“#EndYear”事件
  2. selectedId变量将设置为“EndYear”
  3. 首先$.getJSON将启动
  4. change将触发“#StartYear”事件
  5. selectedId变量将设置为“StartYear”
  6. 将启动第二个$.getJSON
  7. 第一个$.getJSON将完成,selectedId变量的值将是success处理程序中的“StartYear”
  8. 第二个$.getJSON将完成,selectedId变量的值将是success处理程序中的“StartYear”
  9. 所以我认为您只需要使用selectedId变量的不同实例来使用$.getJSON之前的值。您可以以不同的方式实现它。对于我来说,将$.getJSON替换为$.ajax并使用context的{​​{1}}参数似乎是最本土的。代码可以是以下

    $.ajax