我看了这个可能的骗局,比如这个
one
它不一定能解决我的问题。
我的场景是,我有一个带有标签和复选框的orgs组件附加到v模型。该组件将与其他表单组件结合使用。目前,它可以工作-但即使两个复选框都被单击,它也只会将一个值传递回父级。
表格页:
<template>
<section>
<h1>Hello</h1>
<list-orgs v-model="selectedOrgs"></list-orgs>
<button type="submit" v-on:click="submit">Submit</button>
</section>
</template>
<script>
// eslint-disable-next-line
import Database from '@/database.js'
import ListOrgs from '@/components/controls/list-orgs'
export default {
name: 'CreateDb',
data: function () {
return {
selectedOrgs: []
}
},
components: {
'list-orgs': ListOrgs,
},
methods: {
submit: function () {
console.log(this.$data)
}
}
}
</script>
选择组织组件
<template>
<ul>
<li v-for="org in orgs" :key="org.id">
<input type="checkbox" :value="org.id" name="selectedOrgs[]" v-on:input="$emit('input', $event.target.value)" />
{{org.name}}
</li>
</ul>
</template>
<script>
import {db} from '@/database'
export default {
name: 'ListOrgs',
data: () => {
return {
orgs: []
}
},
methods: {
populateOrgs: async function (vueObj) {
await db.orgs.toCollection().toArray(function (orgs) {
orgs.forEach(org => {
vueObj.$data.orgs.push(org)
})
})
}
},
mounted () {
this.populateOrgs(this)
}
}
</script>
目前,数据库中有两个id为1和2的伪org。单击两个复选框并单击提交按钮后,selectedorgs数组仅包含2,就好像第二次单击实际上覆盖了第一次单击。我只选中一个框并点击submit,1或2的值就通过了验证。似乎array方法在组件级工作,但在组件到父级上不工作。
如有任何帮助,我们将不胜感激。
更新
多亏了puelo的评论,我将orglisting组件切换为发出附加到v-model的数组,如下所示:
export default {
name: 'ListOrgs',
data: () => {
return {
orgs: [],
selectedOrgs: []
}
},
methods: {
populateOrgs: async function (vueObj) {
await db.orgs.toCollection().toArray(function (orgs) {
orgs.forEach(org => {
vueObj.$data.orgs.push(org)
})
})
},
updateOrgs: function () {
this.$emit('updateOrgs', this.$data.selectedOrgs)
}
},
mounted () {
this.populateOrgs(this)
}
}
在另一端,我只是console.log()返回。这“有效”,但有一个缺点,似乎$emit在selectedorgs的值更新之前被触发,所以它总是落后一个“check”。实际上,我希望emit等待$data对象更新,这可能吗?