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



我正试图将相同的jQueryJSON 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>元素。

我想将相同的jQuery函数附加到"起始年"one_answers"结束年":

$('[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)

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

例如,如果两个change事件将在短时间间隔内陈述,例如"#EndYear"one_answers"#StartYear",则可能是以下

"#EndYear"的change事件将被触发
  • selectedId变量将设置为"EndYear">
  • 将启动第一个$.getJSON
  • 将触发"#StartYear"的change事件
  • selectedId变量将设置为"StartYear">
  • 第二个$.getJSON将启动
  • 第一个$.getJSON将完成,selectedId变量的值将是success处理程序内部的"StartYear">
  • 第二个$.getJSON将完成,selectedId变量的值将是success处理程序内部的"StartYear">
  • 所以我认为您只需要有selectedId变量的不同实例就可以使用$.getJSON发生之前的值。你可以用不同的方式来实现它。对我来说,将$.getJSON替换为$.ajax,并使用$.ajaxcontext参数似乎是最自然的。该代码可能与以下有关

    $('[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){
    $.ajax({
    url: '@Url.Action("Months")',
    dataType: 'json',
    data: { year: selectedYear },
    context: {selectedId: selectedId},
    success: function (months) {
    var selectedId = this.selectedId; // get from context
    ....
    }
    });
    }
    });
    

    最新更新