У меня есть массив объектов, разделенных на группы. каждая группа имеет свои собственные элементы, и мне нужно установить все флажки для детей, если отмечены родители, и снять флажок, если родители не отмечены. также, если selectAll отмечен, все группы и элементы групп должны быть отмечены
то, что я хочу достичь, совпадает с этим примером
selectall.gif
У меня здесь установлена jsfiddle , и это то, что я сделал до сих пор.
Data
const groups = [
{
id: 1,
name: "TEST A",
items: [
{ id: 1, name: "item 1" },
{ id: 2, name: "item 2" }
]
},
{
id: 2,
name: "TEST B",
items: [
{ id: 3, name: "item 1" },
{ id: 4, name: "item 2" }
]
}
]
HTML
<div id="app">
<div>
<input type="checkbox" class="mb-2" v-model="selectAll" /> select all
<div v-for="group in groups" :key="group.id" class="mb-2">
<input
type="checkbox"
v-model="selectedGroups"
:value="group.id"
/>
<b>{{ group.name }}</b>
<c-item
v-for="item in group.items"
:item="item"
:key="item.id"
@change="onChangeItem"
:checked="selectedItems.includes(item.id)"
/>
</div>
</div>
</div>
<template id="x-item">
<div>
<input
type="checkbox"
@change="$emit('change', item.id, $event)"
:value="item.id"
:checked="checked"
/>
{{ item.name }}
</div>
</template>
JS
Vue.component('c-item', {
props: ['item', 'checked'],
template: "#x-item",
})
new Vue({
el: "#app",
data: {
selectedItems: [],
selectedGroups: [],
groups: [
{
id: 1,
name: "TEST A",
items: [
{ id: 1, name: "item 1" },
{ id: 2, name: "item 2" }
]
},
{
id: 2,
name: "TEST B",
items: [
{ id: 3, name: "item 1" },
{ id: 4, name: "item 2" }
]
}
]
},
methods: {
onChangeItem(itemId, $event) {
if ($event.target.checked) this.selectedItems.push(itemId);
else {
const index = this.selectedItems.findIndex(c => c === itemId);
if (index >= 0) this.selectedItems.splice(index, 1);
}
}
},
computed: {
selectAll: {
get() {
return this.groups
? this.selectedGroups.length == this.groups.length
: false;
},
set(value) {
let selectedGroups = [];
if (value) {
this.groups.forEach(function(item) {
selectedGroups.push(item.id);
});
}
this.selectedGroups = selectedGroups;
}
}
}
})
Кто-нибудь может мне помочь? Заранее спасибо!