2017-08-23 16 views
1

これは私の初めてのスタックオーバーフローを使用しているので、書式中のエラーについてはお詫び申し上げます。選択肢ドロップダウンリストは生成された行で開かれません

データベース内にハザードと呼ばれる新しいオブジェクトを作成する行を生成し、ドロップダウンリストにSelectivityを使用しています。ここで私は、ドロップダウンリストのための私の見解を持っているものです。

@if (Model != null && Model.Count > 0) 
      { 
       int j = 0; 
       foreach (var i in Model) 
       { 
        var hazard = i.hazardID; 
        <tr> 
         <td> 
          <div class="form-groupcol-md-12"> 
           <label class="control-label col-md-2" for="hazardID">Hazard</label> 
           <div class="col-md-10"> 
            @Html.DropDownListFor(Model => Model[j].hazardID, hazardList, htmlAttributes: new { @class = "ddl ddlHazard" })   
            @Html.ValidationMessageFor(m => m[j].hazardID, "", new { @class = "text-danger" }) 
           </div> 
          </div> 

そしてここでは、ボタンがクリックされたとき、私は最後の行に&変更名などを複製するために使用しているjQueryのです:

 $('body').on('click', '#addNew', function (e) { 
      e.preventDefault(); 
      var $tableBody = $("#itemTable"); 
      var $trLast = $tableBody.find("tr:last"); 
      var $trNew = $trLast.clone(); 

      var suffix = $trNew.find(':input:first').attr('name').match(/\d+/); 
      $trNew.find("td:last").html('<a href="#" class="remove glyphicon glyphicon-remove"></a>'); 
      $trLast.find("td:last").html(''); 
      $.each($trNew.find(':input'), function (i, val) { 
       //replace name 
       if (i != 1 && i!=4) 
       { 
        var oldN = $(this).attr('name'); 
        var type = $(this).attr('type'); 
        if (type != "file") { 
         var newN = oldN.replace('[' + suffix + ']', '[' + (parseInt(suffix) + 1) + ']'); 
         $(this).attr('name', newN); 
        } 

        if (type == "text") { 
         if (i != 6) 
          $(this).val(""); 
        } 
        else if (type == "file") { 
         $(this).val(""); 
        } 

        $(this).removeClass("input-validation-error"); 
       } 

      }); 

      $.each($trNew.find('.text-danger'), function (i, val) { 
       var oldD = $(this).attr('data-valmsg-for'); 
       var newD = oldD.replace('[' + suffix + ']', '[' + (parseInt(suffix) + 1) + ']'); 
       $(this).attr('data-valmsg-for', newD); 
      }); 
      $trLast.after($trNew); 

      //reassign validation 
      var form = $("form") 
       .removeData("validator") 
       .removeData("unobtrusiveValidation"); 
      $.validator.unobtrusive.parse(form); 
     }); 

残念ながら、行を追加すると正常に見えますが、ドロップダウンリストをクリックしても何も起こりません。私は通常のドロップダウンリストを使用する(または生成された行なしでフォームを送信する)場合は正常に動作するので、私は間違って何をやっているのか分からない。

オリジナルDDL:

<div class="form-groupcol-md-12"> 
<label class="control-label col-md-2" for="hazardID">Hazard</label> 
<div class="col-md-10"> 
    <select class="ddl ddlHazard" data-val="true" data-val-number="The field Hazard must be a number." data-val-required="You must enter a hazard type" name="[0].hazardID" style="width: 100%; margin-bottom: 6px; display: none;"> 
     <option value="3">Chemical Storage</option> 
     <option value="9">Eyewash</option> 
     <option value="10">First Aid Kit</option> 
     <option value="5">Flamming Storage</option> 
     <option value="2">Food spill</option> 
     <option value="4">Frayed Cords</option> 
     <option value="7">Gaurding</option> 
     <option value="1">Guard Missing</option> 
     <option value="6">Housekeeping</option> 
     <option value="11">Improper Wiring</option> 
     <option value="8">Pinch Points</option> 
     <option value="12">Other</option> 
    </select> 
    <div id="s9y_undefined" class="ddl ddlHazard selectivity-input" style="width:100%;margin-bottom:6px" data-name="[0].hazardID" tabindex="0"> 
     <div class="selectivity-single-select"> 
      <input class="selectivity-single-select-input" type="text"> 
      <div class="selectivity-single-result-container"> 
       <span class="selectivity-single-selected-item" data-item-id="3"> 
        <a class="selectivity-single-selected-item-remove"> 
         <i class="fa fa-remove"></i> 
        </a>Chemical Storage 
       </span> 
      </div> 
      <i class="fa fa-sort-desc selectivity-caret"></i> 
     </div> 
    </div>   
<span class="field-validation-valid text-danger" data-valmsg-for="[0].hazardID" data-valmsg-replace="true"></span> 
</div> 

生成されたDDL:

<div class="form-groupcol-md-12"> 
<label class="control-label col-md-2" for="hazardID">Hazard</label> 
<div class="col-md-10"> 
    <select class="ddl ddlHazard" data-val="true" data-val-number="The field Hazard must be a number." data-val-required="You must enter a hazard type" name="[1].hazardID" style="width: 100%; margin-bottom: 6px; display: none;"> 
     <option value="3">Chemical Storage</option> 
     <option value="9">Eyewash</option> 
     <option value="10">First Aid Kit</option> 
     <option value="5">Flamming Storage</option> 
     <option value="2">Food spill</option> 
     <option value="4">Frayed Cords</option> 
     <option value="7">Gaurding</option> 
     <option value="1">Guard Missing</option> 
     <option value="6">Housekeeping</option> 
     <option value="11">Improper Wiring</option> 
     <option value="8">Pinch Points</option> 
     <option value="12">Other</option> 
    </select> 
    <div id="s9y_undefined" class="ddl ddlHazard selectivity-input" style="width:100%;margin-bottom:6px" data-name="[0].hazardID" tabindex="0"> 
     <div class="selectivity-single-select"> 
      <input class="selectivity-single-select-input" type="text"> 
       <div class="selectivity-single-result-container"> 
        <span class="selectivity-single-selected-item" data-item-id="3"> 
         <a class="selectivity-single-selected-item-remove"> 
          <i class="fa fa-remove"></i> 
         </a>Chemical Storage 
        </span> 
       </div> 
       <i class="fa fa-sort-desc selectivity-caret"></i> 
     </div> 
    </div>   
    <span class="field-validation-valid text-danger" data-valmsg-for="[1].hazardID" data-valmsg-replace="true"></span> 
</div> 

選択性でインスタンス化され、ここで、それは場合に役立ちます新しい行が追加されると、HTMLです。 ddlクラス:

$(document).ready(function() { 
    $(".ddl").each(function() { 
     $(this).selectivity({ 
      allowClear: true 
     }); 
    }); 
}); 

$(this).selectivity( 'open')を強制的に開こうとすると、Selectivityインスタンスを持たない要素のメソッドをコンソールから呼び出せないことがコンソールから伝えられます。どんな助けでも大歓迎です!

+0

あなたは確かに、[選択](HTTPSについて話); ...このソリューションがテストされていません

// Remove the elements injected by selectivity from the clone. $trNew.find("[class^='selectivity-']").remove(); // Instanciate selectivity on the select. $trNew.find(".ddl").selectivity({ allowClear: true }); 

注:

«var $trNew = $trLast.clone();後に、追加します。 io/selectivity /)...あなたが要素上でそれをどのように発覚させているかを示してください...そして、あなたがクローンされた要素上にそれをどのようにインスタンス化するか(ええと...あなたはそれをしなければなりません...)。 –

答えて

0

«インスタンス化»とは、クラスのインスタンスを作成することを意味します。
私は一般的に... <select>要素(この場合は要素)に対して行う必要があります。

"文書準備完了"では、オリジナルのselectでこれを行いました。
これは、 "selectivity-whatever"クラスを持つすべての要素を作成したものです。

この行をクローンしても、Selectivityインスタンスはクローンされません。
クローン化したselectに対してもう一度やり直す必要があります。
これを行う前に、前のインスタンスによって作成された要素をクローンからクリーンアップすることをお勧めします。 //arendjr.github:

+0

ありがとうございます、これは魅力的なように機能しました。 –

関連する問題