Я подозреваю, что то, что вы хотите, чем-то похоже на то, что я сделал ниже:
var data = {
users: [
{ id: 1, name: 'John'},
{ id: 2, name: 'Donald'}
],
roles: [
{ id: 1, name: 'Administrator'},
{ id: 2, name: 'Editor'}
],
form: {
users: []
}
}
var demo = new Vue({
el: '#demo',
data: data,
created: function () {
this.form.users = this.users.map(el => {
return {
id: el.id,
role: '',
checked: false
};
});
}
});
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
Add new users:
<div id="demo">
<div class="row" v-for="(user, index) in users">
<div class="col s6">
<label>
<input type="checkbox"
v-bind:value="user.id" v-model="form.users[index].checked">
<span>{{ user.name }}</span>
</label>
</div>
<div class="col s6" v-if="form.users[index].checked">
<select class="browser-default" v-model="form.users[index].role">
<option v-for="role in roles" v-bind:value="role.id">
{{ role.name }}
</option>
</select>
</div>
</div>
<br/>
Selected users + role:
<div v-for="f in form.users" v-if="f.checked">
User ID: {{ f.id }} -> Role id: {{ f.role }}
</div>
</div>
Структура данных очень похожа на вашу (я только изменил users
с объекта на массив и то же самое для roles
).
Хитрость здесь в том, что created
Жизненный цикл экземпляра , который подготавливает объект form.users
к данным.
Я также воспользовался условным рендерингом показывать выпадающий список ролей только в том случае, если выбран пользователь, поэтому DOM и дизайн более чистые.
Также возможно отображать пользователя в списке, только если выбрана роль, это так же просто, как изменить<div v-for="f in form.users" v-if="f.checked">
до <div v-for="f in form.users" v-if="f.checked && f.role !== ''">
Попробуйте, надеюсь, я смог вам как-то помочь!