代码之家  ›  专栏  ›  技术社区  ›  Niklesh Raut

更改时选择2事件在Vuejs中不起作用

  •  12
  • Niklesh Raut  · 技术社区  · 9 年前

    我在vuejs中使用了select2,我发现vuejs不能使用jquery select2而vuejs只能使用navite html。

    Vue.directive('select', {
            twoWay: true,
            bind: function () {
                $(this.el).select2()
                .on("select2:select", function(e) {
                    this.set($(this.el).val());
                }.bind(this));
                },
            update: function(nv, ov) {
                $(this.el).trigger("change");
            }
        });
        var app = new Vue({
          el: '#app',
          data: {
            supplier_id: "niklesh"
          }
        })
        $('#supplier_id').select2({});
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.4/vue.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.5/css/bootstrap.css">
    <div id="app">
      {{ supplier_id }}
    
    <select id="supplier_id" class='form-control' v-model='supplier_id' v-select='supplier_id'>
        <option value="atul">Atul</option>
        <option value="niklesh">Niklesh</option>
        <option value="sachin">Sachin</option>
    </select>
    
    </div>

    4 回复  |  直到 9 年前
        1
  •  17
  •   tony19 thanksd    3 年前

    要使其与指令一起工作,我们需要了解如何 v-model 作品从 docs :

    <input v-model="something">
    

    只是语法糖:

    <input v-bind:value="something" v-on:input="something = $event.target.value">
    

    在选择元件的情况下, V-模型 将倾听 change 事件(不是 input ). 因此,如果指令发送 改变 元素更改时的事件,然后 V-模型

    以下是代码的更新版本(适用于Vue 2):

    Vue.directive('select', {
      twoWay: true,
      bind: function (el, binding, vnode) {
        $(el).select2().on("select2:select", (e) => {
          // v-model looks for
          //  - an event named "change"
          //  - a value with property path "$event.target.value"
          el.dispatchEvent(new Event('change', { target: e.target }));
        });
      },
      componentUpdated: function(el, me) {
        // update the selection if the value is changed externally
        $(el).trigger("change");
      }
    });
    var app = new Vue({
      el: '#app',
      data: {
        supplier_id: "niklesh"
      },
    })
    $('#supplier_id').select2({});
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.4/vue.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.5/css/bootstrap.css">
    <div id="app">
      {{ supplier_id }}
    
      <select id="supplier_id" class='form-control' v-model='supplier_id' v-select='supplier_id'>
        <option value="atul">Atul</option>
        <option value="niklesh">Niklesh</option>
        <option value="sachin">Sachin</option>
      </select>
    
    </div>

    linked here ):

    var app = Vue.createApp({
      data: function() { 
        return {
          supplier_id: "niklesh"
        }
      }
    })
    
    app.directive('select', {
      beforeMount: function (el, binding, vnode) {
        $(el).select2().on("select2:select", (e) => {
          // v-model looks for
          //  - an event named "change"
          //  - a value with property path "$event.target.value"
          el.dispatchEvent(new Event('change', { target: e.target }));
        });
      },
        updated: function(el) {
        // update the selection if the value is changed externally
        $(el).trigger("change");
      }
    });
    
    app.mount('#app');
    
    $('#supplier_id').select2({});
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.js"></script>
    <script src="https://unpkg.com/vue@3.0.11"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.5/css/bootstrap.css">
    <div id="app">
      {{ supplier_id }}
    
      <select id="supplier_id" class='form-control' v-model='supplier_id' v-select='supplier_id'>
        <option value="atul">Atul</option>
        <option value="niklesh">Niklesh</option>
        <option value="sachin">Sachin</option>
      </select>
    
    </div>
        2
  •  9
  •   Niklesh Raut    9 年前

    通过给vuejs数据分配select2值,我可以解决这个问题。我在这里没有使用自定义指令。

    var app = new Vue({
      el: '#app',
      data: {
        supplier_id: "niklesh"
      },
      filters: {
        capitalize: function (value) {
          if (!value) return ''
          value = value.toString()
          return value.charAt(0).toUpperCase() + value.slice(1)
        }
      }
    });
    
    $('#supplier_id').on("change",function(){
        app.supplier_id = $(this).val();
        console.log('Name : '+$(this).val());
    });
    
    $('#supplier_id').select2({});
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.4/vue.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.5/css/bootstrap.css">
    <div id="app">
      Name : {{ supplier_id | capitalize }}
    <select id="supplier_id" class='form-control' v-model='supplier_id'>
        <option value="atul">Atul</option>
        <option value="niklesh">Niklesh</option>
        <option value="sachin">Sachin</option>
    </select>
    
    </div>

    如果这不是一个好方法或您建议的任何更好的解决方案,请发表评论。

        3
  •  2
  •   عبدالرزاق أوكسا    7 年前
    <select v-model="selected">
           <option value="1">1</option>
           <option value="2">2</option>
           <option value="3">3</option>
    </select>
    
    
    const self = this;
    $("select").change(function () {
            const val = $(this).find("option:selected").val();
            self.selected = val;
     });
    
        4
  •  0
  •   Vladimir Salguero    7 年前

    尝试添加 v-on:change="onChange" 在您的选择控件中

    HTML模板

    <select id="supplier_id" class='form-control' 
    v-model='supplier_id' v-select='supplier_id' v-on:change="onChange">
        <option value="atul">Atul</option>
        <option value="niklesh">Niklesh</option>
        <option value="sachin">Sachin</option>
    </select>
    

    “onChange”是方法的名称

    JavaScript

    methods: {
      onChange(e) {        
          alert("Change");   
      }
    }