#vue.js #vue-reactivity #vue-multiselect
#vue.js #vue-реактивность #vue-multiselect
Вопрос:
Мой компонент Vue multiselect:
<multiselect
required
label="role"
track-by="role"
:close-on-select="false"
:clear-on-select="false"
:preserve-search="true"
:preselect-first="false"
:multiple="true"
:options="roles"
v-model="role.roleID"
>
<template slot="selection" slot-scope="{ values, isOpen }">
<span
class="multiselect__single"
v-if="values.role amp;amp;amp;amp; !isOpen"
>
{{ values.role }}
</span>
</template>
</multiselect>
И метод данных:
data: function () {
return {
role: {
role: '',
description: '',
scopeLevel: '',
roleID: ''
},
roles: [],
}
},
И когда я делаю вызов API, я получаю следующий ответ:
let responce = [
{
'id': '1',
'role': 'Test role'
}, {
'id': '2',
'role': 'Test role 2'
}
]
Когда я пытаюсь привязать этот ответ к multiselect v-model
, т.е. role.roleID
:
this.role.roleID = responce
Компонент multiselect теряет реактивность.
Дайте мне знать, что я здесь делаю не так. Спасибо.
Комментарии:
1. Можете ли вы объяснить, что происходит после установки данных из ответа API. разве это не отображается при выборе multiselect или?
2. @ChathurangaK Он отображается как выбранные параметры, но компоненты multiselect теряют свою реактивность. т.е. Когда я выбираю следующий параметр, он не отображается во внешнем интерфейсе.
Ответ №1:
Без прямого назначения роли попробуйте использовать Vue setter
.
this.$set(this.role, 'roleID', responce);
Ответ №2:
У вас есть некоторые ошибки:
role
переменная в вашемdata
разделе инициализируется как Object — но она должна быть массивом, иначе вы не сможете выбрать несколько параметров- это
v-model
связано сroleID
— но ваш ответ не обладает таким свойством
<multiselect v-model="role" />
data: () => ({
roles: [], // the list of all options
role: [], // the list of currently selected options
})
this.roles = response
Комментарии:
1. Спасибо за ответ. Дело в том, что моя ‘v-model’ — это ‘role.RoleId’, а не ‘role’, т. Е. Я привязываю список выбранных в данный момент параметров к ‘role.RoleId’. В приведенном выше вопросе я дал ему строковое объявление, но даже если я изменил его на string, он не работает. Еще одна вещь, которую я заметил, это то, что перед назначением ответа на ‘role.RoleId’, если я его утешаю, он показывает »
[{…}, {…}, __ob__: Observer]
и когда я назначаю ему массив ответов, а затем утешаю его, он показывает[{…}, {…}]
. Я не уверен, что это__ob__: Observer
за штука, но в этом разница, которую я нашел.2. ** рассмотрите «массив» вместо строки в 3-й строке приведенного выше комментария. Так и будет … я дал ему строковое объявление, но даже если я изменил его на «Массив», он не работает
3. Как я уже говорил ранее —
role.roleID
может сработать, если ваш выбор был ограничен только выбором одного элемента. Но вы явно установили:multiple="true"
, и поэтому для васv-model
обязательно привязываться к массиву. Поэтому, если вы настаиваете на привязке кrole.roleID
— вам следует инициализироватьroleID
как массив, а не как строку, и назначить ответ API дляroles
массива — не дляrole.roleID