Что плохого в том, что вы добавляете свой новый #item-list1
div к существующему #item-list0
, превращая его во вложенную структуру.
То же самое относится к вашему #claim-list
, оно стало вложенной структурой:
#item-list0
⤷ #claim-list0
⤷ #claim-list1
⤷ #claim-list2
⤷ #claim-list3
⤷ #item-list1
⤷ #item-list2
⤷ #item-list3
Вместо этого вы должны добавить их снаружи:
- Добавить новый
#item-listx
к <body></body>
или любой другой родительский элемент. - Добавить новый
#claim-list
к соответствующему #item-list
с.
Таким образом, это будет ваша предполагаемая структура:
#item-list0
⤷ #claim-list0
⤷ #claim-list1
⤷ #claim-list2
#item-list1
⤷ #claim-list0
⤷ #claim-list1
⤷ #claim-list2
И если вы посмотрите на это, возникнет еще несколько проблемс вашим кодом:
- Вы будете дублировать
id
. claimIndex
не будет работать должным образом, потому что вы сбрасываете его каждый раз при нажатии #add
(что произойдет, если янажмите «addClaim» к предыдущим ролям после того, как я добавлю новую роль?)
Ниже приведен пример кода, который работает должным образом (я думаю, на самом деле это может быть не ваш вариант использования).Я перестроил его так, чтобы его можно было легко понять без особых объяснений.Пожалуйста, отредактируйте по мере необходимости, чтобы соответствовать вашей фактической базе кода:
var roleIndex = 0;
$('#add')
.on('click', addRole) // Add onclick handler
.trigger('click'); // Trigger it on execution to create the first set
function addRole(){
roleIndex += 1;
// Set `claimIndex` here, not outside of the scope
// because you need it in each separate added role
// so that the claimIndex of each role can correctly counts independently
var claimIndex = 0,
roleClaimList = 'RoleClaimList[' + roleIndex + ']';
var $itemList = $('<div></div>')
.addClass('form-group')
.attr('id', 'item-list-' + roleIndex);
var $roleLabel = $('<label></label>')
.text('Role Name')
.appendTo($itemList);
var $roleInput = $('<input>')
.addClass('form-control roles')
.attr('asp-for', roleClaimList + '.Role.Name')
.appendTo($itemList);
var $addClaimButton = $('<a></a>')
.text('Add another claim')
.attr('href', '#')
.addClass('addClaim')
.on('click', addClaim)
.appendTo($itemList);
$addClaimButton.trigger('click');
$itemList.insertBefore(this);
// Create this function here, not outside
// because it needs the `claimIndex` in scope
function addClaim(e){
e.preventDefault();
claimIndex += 1;
var $claimGroup = $('<div></div>')
.attr('id', 'claim-list-' + roleIndex + '-' + claimIndex)
.insertBefore($addClaimButton);
var $typeLabel = $('<label></label')
.text('Claim Type')
.appendTo($claimGroup);
var $typeInput = $('<input>')
.addClass('form-control claimType')
.attr('asp-for', roleClaimList + '.ClaimList[' + claimIndex + '].Type')
.appendTo($claimGroup);
var $valueLabel = $('<label></label')
.text('Claim Value')
.appendTo($claimGroup);
var $valueInput = $('<input>')
.addClass('form-control claimValue')
.attr('asp-for', roleClaimList + '.ClaimList[' + claimIndex + '].Value')
.appendTo($claimGroup);
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="form-group" id="item-list-0"></div>
<a href="#" id="add">Add another role</a>
Чтобы узнать больше о области видимости, прочитайте этот удивительный ответ .