2016-10-04 79 views
0

我有一個下拉列表,它從模型中獲取它的值並首先填充。點擊該下拉列表,我使用AJAX填充其他值。我可以填充下拉菜單,但是一旦我從下拉列表中選擇了一個選項,它就會重置爲下拉菜單中的第一個值。我想要的是點擊後填充一次,然後像普通下拉菜單一樣運行。我如何爲它提供條件?未保留下拉值

這是最初與定義的值「field.Value」

ddlValue = "<option value="+field.Value+ " selected='selected'>" + field.Value+"</option>"; 

<td><select id='@String.Format("selValue{0}", field.Field)' class='ddlValue'>@Html.Raw(ddlValue)</select></td> 

設置下拉值的代碼而這正是AJAX函數對其進行填充。

$('body').on('click', '.ddlValue', function() { 
    var target = event.target.id; 
    var rowId = $('#' + target).closest("tr").prop("id"); 
    var field = $('#' + rowId).find(".fieldvalue").html(); 

     $.ajax({ 
      cache: false, 
      url: '@Url.Action("PopulateDropdown", "AdvancedSearch")', 
      type: "POST", 
      data: { Field: field } 
     }).done(function (data) { 

      var listb = $('#' + target); 
      listb.empty(); 

      $.each(data.value, function (index, value) { 
       listb.append($('<option>', { 
        value: value, 
        text: value 
       }, '<option/>')) 
      }); 

     }); 

}); 
+0

你試圖讓下拉填充本身? – FailedUnitTest

+0

@FailedUnitTest我只用一個值填充下拉列表。當有人在下拉菜單中出現問題時,我使用點擊功能來填充剩下的內容。 – TheFallenOne

+0

鑑於提供的代碼,描述的行爲似乎是合理的。每次點擊下拉列表時,單擊的下拉列表將被清空並重新填充。這不是你想要的嗎? – tpdietz

回答

1

如果您希望ajax總體只發生一次,您需要在發生事件偵聽器後才能將其刪除。事情是這樣:

$('.ddlValue').on('click', function() { 

    $(this).off('click'); //This removes the event after it has happened once. 

    var target = event.target.id; 
    var rowId = $('#' + target).closest("tr").prop("id"); 
    var field = $('#' + rowId).find(".fieldvalue").html(); 

    $.ajax({ 
     cache: false, 
     url: '@Url.Action("PopulateDropdown", "AdvancedSearch")', 
     type: "POST", 
     data: { Field: field } 
    }).done(function (data) { 

     var listb = $('#' + target); 
     listb.empty(); 

     $.each(data.value, function (index, value) { 
      listb.append($('<option>', { 
       value: value, 
       text: value 
      }, '<option/>')) 
     }); 

    }); 

}); 

請注意,後續將工作:

$('body').on('click', '.ddlValue', function() { 
    $(this).off('click'); 
    ... 
0

這似乎是這樣做的愚蠢的方式。您可以在沒有與用戶交互的情況下進行相同的貸款操作來填充下拉菜單。

如此說來,以解決您的解決方案只需添加一個全局變量

$first = true 
$('body').on('click', '.ddlValue', function() { 
    if($first) { 
     $first = false 
     var target = event.target.id; 
     var rowId = $('#' + target).closest("tr").prop("id"); 
     var field = $('#' + rowId).find(".fieldvalue").html(); 
     $.ajax({ 
     cache: false, 
     url: '@Url.Action("PopulateDropdown", "AdvancedSearch")', 
     type: "POST", 
     data: { Field: field } 
     }).done(function (data) { 
     var listb = $('#' + target); 
     listb.empty(); 
     $.each(data.value, function (index, value) { 
     listb.append($('<option>', { 
      value: value, 
      text: value 
     }, '<option/>')) 
     }); 
    } 
    }); 
}); 
+0

如果有幾個匹配$('。ddlValue')的元素,我相信這種類型的解決方案會變得複雜,因爲您的布爾標誌將失效。 – tpdietz

+0

我有同樣的評論。當類ddlValue有多個字段時不起作用。 – TheFallenOne

+0

「我有一個下拉菜單,它從模型中獲取它的值並首先填充。單擊該下拉列表時,將其切換爲一個ID,然後將其切換爲單數。 – jacksonecac