您应该做的第一件事是将值和 v-model 绑定到您的复选框:
<input type="checkbox" :id="subregion[0].subregion" v-model="subregionCheck" :value="subregion[0].subregion">
<input type="checkbox" :id="country.name" v-model="countryCheck" :value="country.name">
并在您的数据中添加 subregionCheck 和 countryCheck 数组:
data: {
subregions: null,
countries: null,
query: '',
countryList: [],
subregionCheck:[],
countryCheck: []
},
这些数组用作我们复选框的标记:如果它们包含单个复选框的值,则会检查它。一开始他们都是空的。
在下一步中,我们应该为子区域复选框创建一个侦听器,并为该子区域创建一个检查所有国家/地区复选框的函数。让我们先为我们的子区域添加一个点击监听器:
<input type="checkbox" :id="subregion[0].subregion" v-model="subregionCheck" :value="subregion[0].subregion" @click="checkAllCountries(subregion)">
然后指定方法(只要你不使用 ES6,我需要将“this”委托给变量):
checkAllCountries: function (subregion) {
var that = this;
if (this.subregionCheck.indexOf(subregion[0].subregion) > -1) {
subregion.forEach(function (element) {
if (that.countryCheck.indexOf(element.name) <= -1) {
that.countryCheck.push(element.name);
}
});
}
else {
subregion.forEach(function (element) {
that.countryCheck.splice(that.countryCheck.indexOf(element.name), 1);
})
}
},
现在我们需要一种方法来取消选中子区域复选框,如果其中一个国家未选中。将点击监听器添加到国家复选框:
<input type="checkbox" :id="country.name" v-model="countryCheck" :value="country.name" @click="checkSubregion(subregion)">
然后指定方法:
checkSubregion: function (country) {
if ((this.countryCheck.indexOf(country.name) <= -1) && this.subregionCheck.indexOf(country.subregion) > -1 ) {
this.subregionCheck.splice(this.subregionCheck.indexOf(country.subregion), 1);
}
},
Working fiddle