我尝试使用2个级别(类别和项目)生成一个选择(使用Vue.js和Material Design)。一个类别可以有X个项目(选择与否)。
<md-select v-if="categories.length > 0" name="categories" id="categories" multiple >
<div v-for="(category,key,index) in categories" :key="category.id">
<md-subheader>{{category.name}}</md-subheader>
<md-option
v-if="category.subItems"
v-for="subItem in category.subItems"
:key="subItem.id"
:value="subItem.id"
selected="checkIsSelected(subItem.id)">
{{subItem.name}}
</md-option>
</div>
</md-select>
这会产生一个选择:
Category 1
[ ] - Item 1
[x] - Item 2
[ ] - Item 3
Category 2
...
问题我遇到的是当我尝试检查项目是否已经被选中时(来自API)我使用的方法:
选定=&#34; checkIsSelected(subItem.id)&#34;
在我的methods: {
methods: {
...
checkIsSelected (catId) {
this.selectedOld.map((catOld) => {
if (catId === catOld.id) {
return true
}
})
return false
}
}
简要说明:
如何在一个元素中调用一个函数(带参数) v-for以检查/取消选中元素?
但是这个函数永远不会被调用。我做错了什么?我尝试了其他一些想法,但也没有工作。
感谢您的帮助,谢谢!
答案 0 :(得分:1)
您可以尝试添加v-model="currentCategorySelected"
并使用函数@change="checkIsSelected"
。这样,只要选择了新选项,就会执行并传递通过回调选择的id。
这应该有效:
<md-select
v-if="categories.length > 0"
name="categories"
id="categories"
v-model="currentCategorySelected"
@change="checkIsSelected"
multiple>
<div
v-for="(category,key,index) in categories"
:key="category.id">
<md-subheader>
{{category.name}}
</md-subheader>
<md-option
v-if="category.subItems"
v-for="subItem in category.subItems"
:key="subItem.id"
:value="subItem.id"
>
{{subItem.name}}
</md-option>
</div>
</md-select>
答案 1 :(得分:0)
您需要将selected="checkIsSelected(subItem.id)"
更改为:selected="checkIsSelected(subItem.id)"
。结肠。
答案 2 :(得分:0)
最后,我用不同的方法解决了自己。希望也许可以帮到某人
我没有调用for option
中的函数,而是先调用API来检查它是否先前被选中,并向subItem元素添加属性。
在第一次加载时使用@Ricardo Orellana解决方案,只有当select
值发生变化时,我才能知道选择了哪个项目。
我使用v-bind:class
选项检查是否选择了subItem并标记:
<md-select v-if="categories.length > 0" name="categories" id="categories" multiple v-model="selectedNew">
<md-button class="md-icon-button" md-menu-trigger slot="icon">
<md-icon>{{icon}}</md-icon>
</md-button>
<div v-for="(category,key,index) in categories" :key="category.id">
<md-subheader>{{category.name}}</md-subheader>
<md-option
v-bind:class="{ 'md-checked' : subItem.selected }"
v-if="category.subItems"
v-for="subItem in category.subItems"
:key="subItem.id"
:value="subItem">
{{subItem.name}}
</md-option>
</div>
</md-select>
然后,在method
部分:
...
cat.subItems = actobj
cat.subItems.map(this.markIsSelected)
...
markIsSelected (cat, index, categories) {
categories[index].selected = false
this.selectedOld.forEach(function (catOld) {
if (cat.id === catOld.optionId) {
categories[index].selected = true
return
}
})
}
感谢您的时间和帮助!