1

バックエンドから取得したアイテムを編集する単純なモーダルポップアップがあります。 forにはいくつかの入力と選択コントロールがあります。入力フォームコントロールは正常に動作しますが、選択コントロールは意図したとおりに事前設定されていません。モーダルボックスを設定する方法show.sb.modalイベントを使用して表示される前にSELECTフォームコントロール

私の機能の基本的なアーキテクチャを次のように:

以下
function BootboxEditItem(id) { 

    $.ajax({ 
     // Load back end data 
    }) 
    .done(function(data) { 

     var itemData = data; 

     $.ajax({ 

      // Load form template for modal 
      url: '/modal/item/edit-item.html', 
      ...... 
     }) 
     .success: function (data) ({ 

      var box = bootbox.confirm({ 

       // Set up bootbox buttons; 
      }, 
      callback: function(result){ 

       // Post edited data back to the server 
      } 
     )}; 

     box.on("shown.bs.modal", function(e) { 

      // Populate the modal here using data from the backend. 
      // This is where the problem lies! 
     }) 

     box.modal("show"); 
    }); 
} 

完全なJavaScriptコードです:ここで

function BootboxEditItem(id) { 

var itemDao = ''; 

$.ajax({ 

    type: "GET", 
    contentType: "application/json", 
    url: "/api/item/edit/" + id, 
    dataType: "json", 
    cache: false 
}) 
.done(function (data) { 

    itemDao = data; 

    $.ajax({ 
     type: "GET", 
     url: '/modal/item/item-edit-form.html', 
     success: function (data) { 

      console.log(itemDao); 

      var box = bootbox.confirm({ 

       message: data, 
       title: "Edit Item: [" + itemDao.item.sysId + "]", 
       buttons: { 
        cancel: { 
         label: "Cancel", 
         className: "btn-danger btn-fixed-width-100" 
        }, 
        confirm: { 
         label: "Save", 
         className: "btn-success btn-fixed-width-100" 
        } 
       }, 
       callback: function (result) { 



       } 
      }); 

      box.on("shown.bs.modal", function(e) { 

       console.log(e.currentTarget); 

       var selectItemLevel = document.getElementById('editItemLevel'); 

       console.log(selectItemLevel); 

       $(selectItemLevel).empty(); 

       $.each(itemDao.itemLevels, function (key, index) { 

        var opt = document.createElement('option'); 

        opt.value = index; 
        opt.innerHTML = 'Level ' + index; 

        selectItemLevel.appendChild(opt); 
       }); 

       $(e.currentTarget).find('select[name="editItemLevel"]').val(selectItemLevel); 
       $(e.currentTarget).find('input[name="editIdentifier"]').val(itemDao.item.identifier); 
       $(e.currentTarget).find('textarea[name="editItemValue"]').val(itemDao.item.itemValue); 

      }); 

      box.modal('show'); 
     } 
    }); 
}); 
} 

は、HTMLファイルのコードです:

<form id="editItem" action="/api/items/save" method="post"> 

<input type="hidden" name="artifactId" id="artifactId" value="" /> 
<input type="hidden" name="editId" id="editId" value="" /> 
<input type="hidden" name="editSysId" id="editSysId" value="" /> 
<input type="hidden" name="editSortIndex" id="editSortIndex" value="" /> 

<div class="row"> 
    <div class="col-sm-6"> 
     <div class="form-group"> 
      <label for="editItemLevel">Item level:</label> 
      <select class="form-control" id="editItemLevel" name="editItemLevel"></select> 
     </div> 
    </div> 
    <div class="col-sm-6"> 
     <div class="form-group"> 
      <label for="editItemClass">Item class:</label> 
      <select class="form-control" id="editItemClass" name="editItemClass" onchange="itemEditClassChange();"></select> 
     </div> 
    </div> 
</div> 

<div class="row" id="editRequirementRow"> 
    <div class="col-sm-6"> 
     <div class="form-group"> 
      <label for="editItemType">Requirement type:</label> 
      <select class="form-control" id="editItemType" name="editItemType"></select> 
     </div> 
    </div> 
    <div class="col-sm-6"> 
     <div class="form-group"> 
      <label for="createIdentTemplate">Identifier prefix:</label> 
      <select class="form-control" id="editIdentTemplate" name="editIdentTemplate" onchange="itemEditIdentTemplateChange();"></select> 
     </div> 
    </div> 
</div> 

<div class="row"> 
    <div class="col-sm-6"> 
     <div class="form-group"> 
      <label for="createMediaType">Media type:</label> 
      <select class="form-control" id="editMediaType" name="editMediaType"></select> 
     </div> 
    </div> 
    <div class="col-sm-6" id="editIdentField"> 
     <div class="form-group"> 
      <label for="editIdentifier">Identifier:</label> 
      <input type="text" class="form-control" id="editIdentifier" name="editIdentifier" /> 
     </div> 
    </div> 
</div> 

<div class="form-group"> 
    <label for="editItemValue">Item details:</label> 
    <textarea class="form-control" rows="5" cols="50" id="editItemValue" name="editItemValue"></textarea> 
</div> 

次に、console.log()で出力されるSELECTコントロールの出力を示します。

<select class="form-control" id="editItemLevel" name="editItemLevel"> 
    <option value="1">Level 1</option> 
    <option value="2">Level 2</option> 
    <option value="3">Level 3</option> 
    <option value="4">Level 4</option> 
    <option value="5">Level 5</option> 
    <option value="6">Level 6</option> 
    <option value="7">Level 7</option> 
    <option value="8">Level 8</option> 
    <option value="9">Level 9</option> 
    <option value="10">Level 10</option> 

+0

select要素はどこにありますか?あなたはモーダルを呼び出す前に、選択された要素がDOMに存在することを保証しましたか?あるいは、モーダルが作成されたときに作成されるはずですか? また、selectItemLevel要素の名前とIDは同じですか? –

+0

選択コントロールは、URL: '/modal/item/item-edit-form.html'によって読み込まれたHTMLにあります。問題は、すべての入力コントロールが参照$(e.currentTarget).find( 'input [name = "editIdentifier"]')を使用して動作し、refrence $(e.currentTarget).find( 'select [name = "選択のためのeditItemLevel "] ')は機能しません。それらはすべて同じDOMにあります。 – Lukuluba

+0

あなたはitem-edit-form.htmlのコードを投稿できますか?問題は、id/nameを参照している可能性が最も高いです。 –

答えて

1

は、それはあなたがChromeデベロッパーツールを持っている.IFあなたの各ループが正しく​​3210を追加されていないようだと、あなたは、それを使用するこの機能では、ブレークポイントを入れて、選択オプションがあることを確認する方法を知っています作成し、DOMに追加された:あなたはすでにjQueryのを使用しているので、

$.each(itemDao.itemLevels, function (key, index) { 
      var opt = document.createElement('option'); 
      opt.value = index; 
      opt.innerHTML = 'Level ' + index; 
      selectItemLevel.appendChild(opt); //breakpoint here 
     }); 

また、あなたは次のようにDOMにそれらを追加することができます。

$.each(itemDao.itemLevels, function (key, index) { 
     $(selectItemLevel).append('<option value="'+index+'">Level '+index+'</option>'); 

}); 
1

@ nilerafetr24のおかげで、問題は正しく追加されていませんでした。むしろ、それが表示される前にSELECTコントロールを保持する方法に関するものでした。

確かに、次のコードは動作しません。document.getElementById('editItemLevel')ですが、次のコードは$(e.currentTarget).find('select[name="editItemLevel"])'です。

私の最終的な解決策はこうしてループを書き換えることです。より効率的に見える@ nilerafetr24で提案されたソリューションと組み合わせた後:

$.each(itemDao.itemLevels, function (key, index) { 

     $(e.currentTarget).find('select[name="editItemLevel"]).append('<option=value="'+index'">Level '+index+'</option'); 
    }); 
関連する問題