Привязка данных с множественным выбором Bootstrap-vue: бесконечный цикл

Я пытаюсь настроить элемент управления множественным выбором из bootstrap-vue и привязать его к объекту JSON. Проблема в том, что мне нужно вычисленное значение, чтобы получить мой формат данных json в массиве int для множественного выбора выбранных значений и наоборот. Использование такого вычисляемого свойства означает, что я меняю дату во время рендеринга, что приводит к бесконечному циклу.

В настоящее время я создал вычисляемое свойство, у которого есть геттер, который преобразует массив объектов JSON в целочисленный массив, а также сеттер, который делает противоположное. В моем примере кода объект JSON содержит только идентификатор, но в моем производственном коде есть много других полей внутри «компании».

<template>
  <b-form>
    <b-form-select
    :id="`input-companies`"
    v-model="companiesSelected"
    multiple
    :select-size="4"
    :options="availableCompanies"
    ></b-form-select>
  </b-form>
</template>

<script>
const availableCompanies = [
  { value: 1, text: 'company1' },
  { value: 2, text: 'company2' },
  { value: 3, text: 'company3' },
  { value: 4, text: 'company4' }
]

export default {
  data () {
    return {
      employee: { id: 1, name: 'test', companies: [ { id: 1 }, { id: 2 } ] },
      availableCompanies: availableCompanies
    }
  },
  computed: {
    companiesSelected: {
      get () {
        if (this.employee.companies == null) {
          return []
        }
        return this.employee.companies.map(company => { return company.id } )
      },
      set (newValue) {
        if (newValue == null) {
          this.employee.companies = []
        } else {
          this.employee.companies = newValue.map(companyId => { return { id: companyId } })
        }
      }
    }
  }
}
</script>

Настройка this.employee.companies приводит к бесконечному циклу. Я действительно не знаю, как этого избежать. Кто-нибудь знает, как побороть эту проблему?


person noboevbo    schedule 27.06.2019    source источник


Ответы (1)


Я в основном разделил ваш вычисленный набор на событие @change, и, похоже, он работает.

Событие @change должно запускаться только при взаимодействии с пользователем и поэтому должно вызывать цикл.

https://codepen.io/Hiws/pen/agVyNG?editors=1010

Я не уверен, достаточно ли этого для вас, поскольку я не учел дополнительные поля компании при написании примера выше.

person Hiws    schedule 27.06.2019
comment
Отлично, спасибо за совет. Я просто немного изменил его, заменив v-model на v-bind:value, чтобы предотвратить v-on: input по умолчанию и @change на v-on:change. Вот вилка с этими изменениями: codepen.io/anon/pen/KjyQQG?editors=1010 - person noboevbo; 27.06.2019