3

I use vue.js (v2.6.14) and vue-multiselect (v2.1.6) in my app.

I have a problem with changing data inside multiselect component by clicking on sibling element input[type='checkbox'].

components: {
  Multiselect
},
data() {
 residence: {
  name: 'Not selected'
 },
 residenceOptions: [
  { name: 'Not selected' },
  { name: 'Albania' },
  { name: 'Algeria' },
  ...
  { name: 'United Arab Emirates'}
 ]
}
<multiselect
 v-model='residence'
 :options='residenceOptions'
 label='name'
 placeholder='Residence'
 track-by='name'>
    <template slot='singleLabel' slot-scope='{ option }'>
       <strong>{{ option.name }}</strong>
    </template>
</multiselect>

<div class='form__checkbox'>
 <input
  id='quotationForm-resident'
  class='form__input'
  name='residence'
  type='checkbox'
  placeholder=''
  :checked='residence && residence.name === "United Arab Emirates"'
  @click='residence.name = "United Arab Emirates"'
/>

What I expected from this code: by clicking on the checkbox, the selected value (data.pointer inside multiselect component) would be different (one for an element with the name "United Arab Emirates").

What I got: instead of changing the selected element from the list, multiselect just rewrites every name property of chosen element withe the value "United Arab Emirates".

I hope I could describe that problem correctly

Nikola Pavicevic
  • 21,952
  • 9
  • 25
  • 46

1 Answers1

1

Try with @select and :value instead of v-model:

new Vue({
  el: '#demo',
  components: { Multiselect: window.VueMultiselect.default },
  data() {
    return {
      residence: {
        name: 'Not selected'
      },
      residenceOptions: [
        { name: 'Not selected' },
        { name: 'Albania' },
        { name: 'Algeria' },
        { name: 'United Arab Emirates'}
      ]
    }
  },
  methods: {
    uae() {
      this.residence.name = 
        this.residence.name !== 'United Arab Emirates' ?
          'United Arab Emirates' :
          'Not selected'
    },
    onSelect(option) {
      this.residence.name = option.name
    }
  }
})
<script src="https://unpkg.com/vue-multiselect@2.1.0"></script>
<link rel="stylesheet" href="https://unpkg.com/vue-multiselect@2.1.0/dist/vue-multiselect.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="demo">
  <multiselect
     :value='residence'
     :options='residenceOptions'
     label='name'
     placeholder='Residence'
     @select="onSelect"
  >
    <template slot='singleLabel' slot-scope='{ option }'>
       <strong>{{ option.name }}</strong>
    </template>
  </multiselect>
  <div class='form__checkbox'>
    <input
      id='quotationForm-resident'
      class='form__input'
      name='residence'
      type='checkbox'
      placeholder=''
      :checked='residence && residence.name === "United Arab Emirates"'
      @click='uae'
    />
  <p>{{residenceOptions}}</p><b>selected: {{residence}}</b>
</div>
Nikola Pavicevic
  • 21,952
  • 9
  • 25
  • 46