我是Vue.js的初学者,对此深陷其中:
<span>Condition</span>
<el-select style="width: 94%;" v-model="condition[index+1]">
<el-option label="Ambient" value="Ambient">Ambient</el-option>
<el-option label="Frozen" value="Frozen">Frozen</el-option>
</el-select>
<h4>
<el-checkbox v-model="check[index+1]" @change="selectAllPanels(index+1, item.id)">Select All</el-checkbox>
</h4>
<div class="card-content panels-category" v-for="(category, n) in panelsCategory[item.id]" :key="category.id" style="float: left">
<div class="panel-category" v-if="searchList[item.id][n].length > 0">
<el-checkbox v-model="checkAll[index+1][item.id][n]" @change="checkAllPanel(index+1, item.id, n)" :label="category.id" :key="category.id">
<h5 class="card-title">{{ category[0].panel_category }}</h5>
</el-checkbox>
</div>
<div class="panels" v-for="panels in searchList[item.id][n]" :key="panels.id"> <!-- in panelsCategory[item.id][n]-->
<!--<el-checkbox-group class="panels-name" v-model="selectedPanels[index+1][item.id]" @change="handelAddSample(index+1)">-->
<el-checkbox :checked="checkAll[index+1][item.id][n]" class="panels-name" v-model="selectedPanels[index+1][item.id]" @change="handelAddSample()" :label="panels.id" :key="panels.id" >{{panels.reportable_name}}</el-checkbox>
<el-popover class="panel-popover"
trigger="hover"
@show="getPanelTest(panels.id)"
placement="bottom">
<el-button slot="reference" class="ti-help popover-help"></el-button>
<slot>{{panelTest}}</slot>
</el-popover>
<!--</el-checkbox-group>-->
</div>
<div class="panels" v-if="searchList[item.id][n].length > 0" v-for="i in getPanelsLength(index+1, item.id, n)" ></div>
</div>
单击右侧的加号按钮->从下拉列表中单击某项->显示新标签页
因此,在这些选项卡中出现了魔术:复选框运行不正常,我的意思是在单击“全选”复选框时,应选中所有复选框,但这只有在单击一个子类别复选框后才会发生(例如第三个孩子),但是填充了所选复选框的列表填充良好。
我尝试了this.$forceUpdate()
甚至this.$set()
内的函数,这些函数在单击“全选”和类别标题(带有蓝色背景的那些)时单击
有人可以帮忙吗?
我试图在这个小提琴Here中重现它。
答案 0 :(得分:0)
问题似乎出在chekbox上
<el-checkbox
:checked="checkAll[index+1][item.id][n]"
class="panels-name"
v-model="selectedPanels[index+1][item.id]"
@change="handelAddSample()"
:label="panels.id" :key="panels.id"
>{{panels.reportable_name}}</el-checkbox>
此元素同时定义了:checked
和v-model
,尽管更重要的是,您正在对静态数据使用模型(更新searchList,而不是checkAll)。对于元素用户界面,您只能使用v-model
,然后传递checkAll
而不是searchList
。
<el-checkbox
v-model="checkAll[index+1][item.id][n]"
class="panels-name"
@change="handelAddSample()"
:label="panels.id" :key="panels.id"
>{{panels.reportable_name}}</el-checkbox>
您应该做的另一件事是在更新嵌套属性时使用this。$ set
selectAllPanels(index, item) {
if (this.check[index] === true) {
this.$set(this.check, index, true) // <--- note use of $set here
} else {
this.$set(this.check, index, false) // <--- here
}
for (let i = 0; i <= this.panelsCategory[item].length; i++) {
console.log(this.panelsCategory[item][i])
if (this.panelsCategory[item][i] !== undefined && this.check[index]) {
this.$set(this.checkAll[index][item], i, true) // <--- here
this.checkAllPanel(index, item, i)
} else {
if (this.panelsCategory[item][i] !== undefined) {
this.$set(this.checkAll[index][item], i, false) // <--- and here
this.checkAllPanel(index, item, i)
}
}
}
//this.$forceUpdate() // <--- then you don't need forceUpdate
},
答案 1 :(得分:0)
<el-checkbox class="panels-name"
:value="!!selectedPanels[index+1][item.id].find(i=>i===panels.id)"
@change="handelAddSample(index+1,item.id,panels.id)"
:label="panels.id"
:key="panels.id"
>{{panels.reportable_name}}
</el-checkbox>
与:value="!!selectedPanels[index+1][item.id].find(i=>i===panels.id)"
绑定,它有效。
只需将其添加到孩子
handelAddSample(a,b,id) {
let m = -1;
if(!!this.selectedPanels[a][b].find((i,index)=>{if(i===id){m=index;return true}})){
this.selectedPanels[a][b].splice(m,1);
}else {
this.selectedPanels[a][b].push(id);
}
this.$forceUpdate()
},