Bootstrap-select & Vue.js: selectpicker ('refresh') не работает - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь реализовать плагин bootstrap-select (находится здесь https://developer.snapappointments.com/bootstrap-select/) в приложении ruby ​​on rails с Vue.js в качестве фреймворка javascript.

Цель состоит в том, чтобы в одном selectВы можете выбрать категорию, а в другой - всех учителей, доступных для этой категории. Для этого я использую axios и vue, чтобы сделать запрос к моему собственному API, и использую его для заполнения второго выбора, и он отлично работает спростое поле выбора, однако я хочу, чтобы boottrap-select отображался, я знаю, что в плагине есть функция "selectpicker ('refresh')", чтобы сделать возможной перезагрузку опции, но моя консоль браузера утверждает, что selectpicker не является функцией при вызовеэто на моем экземпляре vue, однако я могу вручную запустить его на консоли браузера, однако он работает как задумано

Мой код:

js:

Vue.use(VueAxios, axios)
    document.addEventListener('DOMContentLoaded', () => {
      if(document.getElementById('enrollment_form')) {
      var app = new Vue({
        el: '#enrollment_form',
        data: {
          CategoryValue: null,
          TeacherValue: null,
          teachers: null,
        },
        methods: {
          fetchTeachers() {
            this.axios.get('/api/teachers/' + this.licenceTypeValue).then(response => (this.teachers = response.data))
              $('.selectpicker').selectpicker('refresh');
          }
        }, 
      })
    }})

view:

       <div class="row">
          <div class="col-lg-5">
            <div class="form-group">
              <%= f.label :category %>*<br />
              <%= f.collection_select(
                  :category,
                  Category.all,
                  :id,
                  :catgegory_name,
                  {include_blank: true},
                  {
                    class: 'form-control selectpicker',
                    "v-model" => "CategoryValue",
                    "v-on:change" => "fetchTeachers"

                  }
              )%>
            </div>
          </div>  
        </div>

        <div class="row">
          <div class="col-lg-5">
            <div class="form-group">
              <label for="teacher_id">Teacher</label>
              <div>
                <select id="teachers-list" class='form-control selectpicker' v-model="TeacherValue" data-fieldname = "TeacherValue">
                  <option label="" ></option>
                  <option v-for="teacher in teachers" :value="teacher.id"> {{teacher.name}}  </option>
                </select>
              </div>
            </div>
          </div>  
        </div>

        <div>
          <%= f.hidden_field :teacher_id, {"v-model" => "TeacherValue"} %>
        </div>

Наконец-то мое application.js

//= require rails-ujs
//= require activestorage
//= require jquery
//= require jquery_ujs
//= require popper
//= require bootstrap
//= require bootstrap-select

Я был бы очень признателен, если бы кто-то мог помочь, поскольку я просто не могу понять, что делать

1 Ответ

0 голосов
/ 30 декабря 2018

Попробуйте перейти к следующему:

var app = new Vue({
    el: '#enrollment_form',
    data: {
        CategoryValue: null,
        TeacherValue: null,
        teachers: null,
    },
    methods: {
        fetchTeachers() {
            // Get the Vue object in a variable so you can use it in the "then" 
            // since 'this' context changes in the "then" handler function.
            let theVue = this;

            this.axios
                .get('/api/teachers/' + this.licenceTypeValue)
                .then(response => {
                    theVue.teachers = response.data;
                    // Call bootstrap-select's 'refresh' using Vue's $nextTick function 
                    // to ensure the update is complete before bootstrap-select is refreshed.
                    theVue.$nextTick(function(){ $('#teachers-list').selectpicker('refresh'); });
                });
        }
    }, 
})

Я столкнулся с этой проблемой в разрабатываемом приложении и написал статью с более подробным объяснением , включая сломанные ирабочие примеры.Мои примеры изменяют параметры с помощью JavaScript без AJAX, но концепция та же.

В приведенном выше коде вы вызываете bootstrap-select 'refresh', используя функцию $ nextTick Vue, которая ожидает обновления объекта Vue.завершается перед выполнением кода, переданного вызову $ nextTick.(см. $ nextTick в документации Vue )

Примечание. Вы также можете выполнить более общее обновление в обработчике события update в Vue, добавив:

updated: function(){
  this.$nextTick(function(){ $('.selectpicker').selectpicker('refresh'); });
}

Обратите внимание, что при этом всегда будут обновляться все варианты начальной загрузки, которые имеют один и тот же класс selectpicker.Обновление будет происходить при каждом обновлении данных vue, включая те, которые не относятся к рассматриваемым

Я считаю, что лучше всего обновлять только

...