首页 文章

VueJS Select2指令不会触发@change事件

提问于
浏览
6

正如 Headers 所说,我使用他们页面中的示例为VueJS 1.0.15注册了Select2指令 . 我想捕捉@change事件,但它不起作用 .

HTML:

<select v-select="item.service" :selected="item.service" @change="serviceChange(item)">
  <option value="1">test 1</option>
  <option value="2">test 2</option>
</select>

JS:

Vue.directive('select', {
    twoWay: true,
    params: ['selected'],
    bind: function () {
        var self = this
        $(this.el)
            .select2({
                minimumResultsForSearch: Infinity
            })
            .val(this.params.selected)
            .on('change', function () {
                console.log('changed');
                self.set(this.value);
            })
    },
    update: function (value) {
        $(this.el).val(value).trigger('change')
    },
    unbind: function () {
        $(this.el).off().select2('destroy')
    }
});

var Checkout = new Vue({
      el: '.Checkout',
      methods: {
      serviceChange: function (item) {
          console.log(item);
      },
    }
});

4 回答

  • 0

    你不应该使用$ emit吗?

    update: function (value) {
        $(this.el).val(value);
        this.$emit('change');
    }
    
  • 6

    是的,我遇到了这个问题 . 尚未找到解决方案,但这是我目前的工作轮次使用 watch

    在你的VueJS中:

    watch: {
    
        /**
         * Watch changes on the select2 input
         *
         * @param integer personId
         */
        'person': function (personId) {
            var personName = $("#person").select2('data')[0].text
            this.doSomethingWithPerson(personId, personName)
        }
    },
    

    然后在你的HTML中:

    <select
            id="person"
            v-select2="person"
            class="form-control"
            data-options="{{ $peopleJSON }}"
            data-placeholder="Choose a person"
    >
    </select>
    

    注意:在上面的HTML中, {{ $peopleJSON }} 就是我使用Blade模板引擎插入服务器端JSON的方式 . 与这个问题不太相关 .

  • 0

    我最近在尝试将select2结果绑定到vuejs数据模型对象时出现问题,并且我提供了一种解决方法,它可能对您有所帮助:

    https://jsfiddle.net/alberto1el/7rpko644/

    var search = $(".search").select2({
      ajax: {
        url: "/echo/json",
        dataType: 'json',
        delay: 250,
        data: function (params) {
          return {
            q: params.term
          };
        },
        processResults: function (data, params) {
          var mockResults = [{id: 1,text: "Option 1"}, {id: 2,text: "Option 2"}, {id: 3,text: "Option 3"}];
          return {results: mockResults};
        },
        cache: true
      },
      escapeMarkup: function (markup) { return markup; },
      minimumInputLength: 1
    });
    
    search.on("select2:select", function (e){
        $('.result_search').val( $(this).val() ).trigger( 'change' );
    });
    
    var vm = new Vue({
      el: "#app",
      data: {
        busqueda_result : ''
      }
    });
    

    我知道你正在使用指令,但也许它可以帮助你

  • -1

    扩展到Alberto Garcia的回答 .

    var selectDropDown = $(".select-drop-down").select2();
    
    selectDropDown.on('select2:select', function (e) {
        var event = new Event('change');
        e.target.dispatchEvent(event);
    });
    

相关问题