グループ入力のリストを作成して、ユーザーがグループ行を動的に追加/削除できるようにします。
<div id="div-form-denominations" class="form-denominations">
<div id="row-0" class="form-denomination">
<div class="form-field">
<div class="form-field">
<div class="form-field">
<input id="_denominations[0].id.reference" class="removableHiddenOrder" type="hidden" name="denominations[0].id.reference" value="87-070329-034COP-4444">
<input id="_denominations[0].denomination" class="removableHiddenDenom" type="hidden" name="denominations[0].denomination" value="10000">
<a id="deleteBtn-[0]" class="action-link delete-denomination" href="#">
<div class="spacer"></div>
</div>
<div id="row-1" class="form-denomination">
<div class="form-field">
<div class="form-field">
<div class="form-field">
<input id="_denominations[1].id.reference" class="removableHiddenOrder" type="hidden" name="denominations[1].id.reference" value="87-070329-034COP-4444">
<input id="_denominations[1].denomination" class="removableHiddenDenom" type="hidden" name="denominations[1].denomination" value="">
<a id="deleteBtn-[1]" class="action-link delete-denomination" href="#">
<div class="spacer"></div>
</div>
<div id="row-2" class="form-denomination">
<div class="form-field">
<div class="form-field">
<div class="form-field">
<input id="_denominations[2].id.reference" class="removableHiddenOrder" type="hidden" name="denominations[2].id.reference" value="">
<input id="_denominations[2].denomination" class="removableHiddenDenom" type="hidden" name="denominations[2].denomination" value="">
<a id="deleteBtn-[2]" class="action-link delete-denomination" href="#">
<div class="spacer"></div>
</div>
<div id="row-3" class="form-denomination">
.......
</div>
したがって、各行には、入力または選択コンポーネント(上記のコードには表示されていません)といくつかの非表示フィールド、および現在の行をビューから削除するための削除リンクを含むフォームフィールドのグループが含まれます。
また、セクションに新しい行を動的に追加するためのリンクを作成します
var rowTemplate = null;
j(document).ready(function() {
// Save the row template
rowTemplate = j('.form-denomination:first-child').clone();
j("#add_link").click(function() {
add_denomination();
});
});
add_denomination
これは、最初の行を複製し、複製されたIDを新しいインデックスに置き換え、複製された行をリストの最後の行の後に追加する関数の内容です。
function add_denomination() {
var index = j('.form-denomination').length;
// set the new row id
var newRowId = 'row-' + index;
var newRow = rowTemplate.clone().attr('id', newRowId);
// Replace the id/name attribute of each input control
newRow.find('div, input, select, a').each(function() {
replaceAttribute(j(this), 'id', index);
replaceAttribute(j(this), 'name', index);
j(this).val('');
});
// add new element to the DOM
newRow.appendTo('.form-denominations');
alert("new list size = " + j(".delete-denomination").length);
console.log("DONE!");
}
ポップアップアラートをクリックするたびにadd-link
、新しいリストサイズ(j( "。delete-denomination")。lengthが1ずつ増加します)が表示されます。これは、私の理解では、新しい行が正常に追加されました。
問題は次の方法です
// delete denomination row
j('.delete-denomination').click(function () {
j(this).parent().remove();
}
クローンされていない行でのみ機能します!!! firebugを使用すると、追加された行に元の行と同じ構造と同じ要素が正常に追加されていることがはっきりとわかりますが、違いはIDだけです。
deleteBtn-[i]
ただし、 iがcloned/appended
行のインデックスであるをクリックするたびに、コードがj('.delete-denomination').click()
関数に入らないこともあります。これは、私の理解では、Domまたはjqueryが新しい行を認識しなかったため、jQueryによるリンクの識別に失敗しました。 。これは、リストのサイズが大きくなったことを示す以前のアラートメッセージとは矛盾しています。
しかし、私deleteBtn-[i]
が行である場所をクリックするとnon-cloned
、すべてが正常に機能します...
したがって、問題は、新しいdomを追加/追加し、jQueryまたはDomで識別させる方法です。上記の処理の何が問題になっていますか?Dom / jQueryが追加された行をすべての観点から理解できるように、リストを更新する方法はありますか?