vuetify v-select с несколькими опциями - получение выбранной / отмененной опции
Я использую Vuetify
И его v-select
компонент с multiple
опция включена, чтобы позволить выбрать несколько вариантов.
Эти параметры представляют пулы талантов (кандидатов) для моего программного обеспечения CRM.
Что нужно сделать, так это то, что когда отмечена какая-то опция в v-select, кандидаты из проверенного пула талантов выбираются из API и сохраняются в некотором массиве (назовем его markedCandidates
), и когда опция не выбрана, кандидаты из этого пула должны быть удалены из markedCandidates
массив.
Проблема в том, что @change
или же @input
события возвращают полный список выбранных опций. Мне нужно, чтобы он возвращал только выбранный / отмененный пул и информацию, если он выбран или отменен, чтобы иметь возможность обновить markedCandidates
массив.
Мой существующий код:
<v-select return-object multiple @change="loadCandidatesFromTalentPool" v-model="markedCandidates" :item-text="'name'" :item-value="'name'" :items="talentPoolsSortedByName" dense placeholder="No pool selected" label="Talent Pools" color='#009FFF'>
<template slot="selection" slot-scope="{ item, index }">
<span v-if="index === 0">{{ item.name }}</span>
<span v-if="index === 1" class="grey--text caption othersSpan">(+{{ talentPools.length - 1 }} others)</span>
</template>
</v-select>
Есть идеи, как это решить?
Как я сказал, loadCandidatesFromTalentPool(change)
возвращает полный массив v-model
(markedCandidates
)..
РЕДАКТИРОВАТЬ: Я нашел это решение, на самом деле это скорее обходной путь, было бы неплохо, если бы для этой ситуации было выделено событие:
1 ответ
Замещать
:item-text="'name'" :item-value="'name'"
от
item-text="name" item-value="name"
На самом деле есть только одно событие, связанное с изменением значений v-autocomplete
: @change
(См. https://vuetifyjs.com/en/components/autocompletes). watch
Подход полезен, если вы хотите отслеживать только отдельные изменения. Однако, если вы планируете сделать это с большим количеством селекторов, может быть лучше, если вы создадите настраиваемый компонент многократного использования с новым прикрепленным событием (в этом примере для последнего изменения).
Vue.component('customselector',{
props:[
"value",
"items"
],
data: function() {
return {
content: this.value,
oldVal : this.value
}
},
methods: {
handleInput (e) {
this.$emit('input', this.content)
},
changed (val) {
oldVal=this.oldVal
//detect differences
const diff = [
...val.filter(x => !oldVal.includes(x)),
...oldVal.filter(x => !val.includes(x))
]
this.oldVal = val
var deleted=[]
var inserted=[]
// detect inserted/deleted
for(var i=0;i<diff.length;i++){
if (val.indexOf(diff[i])){
deleted.push(diff[i])
}else{
inserted.push(diff[i])
}
}
this.$emit("change",val)
this.$emit("lastchange",diff,inserted,deleted);
}
},
extends: 'v-autocomplete',
template: '<v-autocomplete @input="handleInput" @change="changed" :items="items" box chips color="blue lighten-2" label="Select" item-text="name" item-value="name" multiple return-object><slot></slot></v-autocomplete>',
})
Тогда вы можете использовать свой компонент так же просто, как:
<customselector @lastchange="lastChange" >...</customselector>
methods:{
lastChange: function(changed, inserted, deleted){
this.lastChanged = changed
}
}
changed
показывает только те элементы, которые действительно изменены. Я добавил inserted
а также deleted
массивы для возврата новых элементов, добавленных или удаленных из выбора.
Пример источника: https://codepen.io/fraigo/pen/qQRvve/?editors=1011