У меня есть несколько групп и несколько вариантов внутри каждой группы. Когда я нажимаю на выбор внутри группы, groupcount
всегда должен + 1, а щелкнутый choicecount
должен быть установлен на 1, а другие choicecount
внутри группы должны быть сброшены на 0.
Я пытался использовать $dispatch
, чтобы сбросить все choicecount
внутри группы до 0 перед установкой choicecount = 1
и groupcount++
, но $dispatch
, похоже, не запускает другие вложенные choicecount
внутри группы.
Например, во фрагменте ниже (группа 1):
Только один из G1 Option 1
, G1 Option 2
, G1 Option 3
должен быть равен 1 одновременно.
Если G1 Option 2
= 1, то G1 Option 1
и G1 Option 3
должны быть = 0. groupcount
работают нормально.
Примечание. Это урезано, переключатели не подходят для функции, которую я создаю, и я не использую x-for
, потому что эти группы и варианты будут сгенерированы из цикла PHP. Количество групп и вариантов будет варьироваться.
<script src = "https://unpkg.com/[email protected]/dist/cdn.min.js"></script>
<!-- GROUP 1 -->
<div x-data = "{ groupcount: 0 }">
<label>Group 1 Count</label>
<input x-model = "groupcount" type = "text">
<div x-data = "{ choicecount: 0 }">
<div x-on:resetAllCountsInGroup = "choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('resetAllCountsInGroup'),choicecount=1,groupcount++">
G1 Option 1
</button>
</div>
</div>
<div x-data = "{ choicecount: 0 }">
<div x-on:resetAllCountsInGroup = "choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('resetAllCountsInGroup'),choicecount=1,groupcount++">
G1 Option 2
</button>
</div>
</div>
<div x-data = "{ choicecount: 0 }">
<div x-on:resetAllCountsInGroup = "choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('resetAllCountsInGroup'),choicecount=1,groupcount++">
G1 Option 3
</button>
</div>
</div>
</div>
<hr>
<!-- GROUP 2 -->
<div x-data = "{ groupcount: 0 }">
<label>Group 2 Count</label>
<input x-model = "groupcount" type = "text">
<div x-data = "{ choicecount: 0 }">
<div x-on:resetAllCountsInGroup = "choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('resetAllCountsInGroup'),choicecount=1,groupcount++">
G2 Option 1
</button>
</div>
</div>
<div x-data = "{ choicecount: 0 }">
<div x-on:resetAllCountsInGroup = "choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('resetAllCountsInGroup'),choicecount=1,groupcount++">
G2 Option 2
</button>
</div>
</div>
</div>
<hr>
<!-- GROUP 3 -->
<div x-data = "{ groupcount: 0 }">
<label>Group 3 Count</label>
<input x-model = "groupcount" type = "text">
<div x-data = "{ choicecount: 0 }">
<div x-on:resetAllCountsInGroup = "choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('resetAllCountsInGroup'),choicecount=1,groupcount++">
G3 Option 1
</button>
</div>
</div>
<div x-data = "{ choicecount: 0 }">
<div x-on:resetAllCountsInGroup = "choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('resetAllCountsInGroup'),choicecount=1,groupcount++">
G3 Option 2
</button>
</div>
</div>
</div>
В примере есть три проблемы. Во-первых, из-за всплытия событий нам нужно использовать .window
модификатор для прослушивателей событий. Во-вторых, CamelCasing не поддерживается внутри атрибутов HTML, поэтому нам нужно использовать тире в имени события (или использовать .camel
модификатор), я буду использовать reset-group
в примере. Последняя проблема заключается в том, что событие сброса теперь действует на каждую группу, поэтому нам нужно ограничить его область действия текущей группой. Для этого я добавил свойство groupid
в каждую группу, которое является уникальным и также включено в событие, поэтому мы можем проверить его значение внутри прослушивателя событий с помощью if (groupid == $event.detail) choicecount=0
перед сбросом группы.
<script src = "https://unpkg.com/[email protected]/dist/cdn.min.js"></script>
<div x-data = "{ groupcount: 0, groupid: 1 }">
<label>Group 1 Count</label>
<input x-model = "groupcount" type = "text">
<div x-data = "{ choicecount: 0 }">
<div x-on:reset-group.window = "if (groupid == $event.detail) choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('reset-group', groupid),choicecount=1,groupcount++">
G1 Option 1
</button>
</div>
</div>
<div x-data = "{ choicecount: 0 }">
<div x-on:reset-group.window = "if (groupid == $event.detail) choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('reset-group', groupid),choicecount=1,groupcount++">
G1 Option 2
</button>
</div>
</div>
<div x-data = "{ choicecount: 0 }">
<div x-on:reset-group.window = "if (groupid == $event.detail) choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('reset-group', groupid),choicecount=1,groupcount++">
G1 Option 3
</button>
</div>
</div>
</div>
<div x-data = "{ groupcount: 0, groupid: 2 }">
<label>Group 2 Count</label>
<input x-model = "groupcount" type = "text">
<div x-data = "{ choicecount: 0 }">
<div x-on:reset-group.window = "if (groupid == $event.detail) choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('reset-group', groupid),choicecount=1,groupcount++">
G2 Option 1
</button>
</div>
</div>
<div x-data = "{ choicecount: 0 }">
<div x-on:reset-group.window = "if (groupid == $event.detail) choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('reset-group', groupid),choicecount=1,groupcount++">
G2 Option 2
</button>
</div>
</div>
<div x-data = "{ choicecount: 0 }">
<div x-on:reset-group.window = "if (groupid == $event.detail) choicecount=0">
<input x-model = "choicecount" type = "text">
<button type = "button" x-on:click = "$dispatch('reset-group', groupid),choicecount=1,groupcount++">
G2 Option 3
</button>
</div>
</div>
</div>