更改事件上的 Select2 在 Vuejs 中不起作用 [英] Select2 on change event is not working in Vuejs

查看:20
本文介绍了更改事件上的 Select2 在 Vuejs 中不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 vuejs 中使用 select2,我发现 vuejs 不能使用 jquery select2,因为 vuejs 正在使用 navite html.

我正在使用此代码

Vue.directive('select', {双向:真实,绑定:函数(){$(this.el).select2().on("select2:select", function(e) {this.set($(this.el).val());}.bind(this));},更新:函数(NV,OV){$(this.el).trigger("change");}});var app = new Vue({el: '#app',数据: {供应商_id:niklesh"}})$('#supplier_id').select2({});

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.js"></脚本><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="应用程序">{{供应商_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></选择>

请分享您的回复以解决此问题.

解决方案

为了让它与指令一起工作,我们需要了解 v-model 是如何工作的.来自 文档:><块引用>

只是语法糖:

在选择元素的情况下,v-model 将监听 change 事件(而不是 input).因此,如果指令在元素更改时调度 change 事件,则 v-model 将按预期工作.

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

Vue.directive('select', {双向:真实,绑定:函数(el,绑定,vnode){$(el).select2().on("select2:select", (e) => {//v-model 寻找//- 一个名为change"的事件//- 属性路径为$event.target.value"的值el.dispatchEvent(new Event('change', { target: e.target }));});},组件更新:功能(el,我){//如果外部更改了值,则更新选择$(el).trigger("change");}});var app = new Vue({el: '#app',数据: {供应商_id:niklesh"},})$('#supplier_id').select2({});

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.js"></脚本><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="应用程序">{{供应商_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></选择>

这里有一个适用于 Vue 3 的版本(自定义指令有不同的语法,此处链接):

var app = Vue.createApp({数据:函数(){返回 {供应商_id:niklesh"}}})app.directive('选择', {beforeMount:函数(el,绑定,vnode){$(el).select2().on("select2:select", (e) => {//v-model 寻找//- 一个名为change"的事件//- 属性路径为$event.target.value"的值el.dispatchEvent(new Event('change', { target: e.target }));});},更新:功能(el){//如果外部更改了值,则更新选择$(el).trigger("change");}});app.mount('#app');$('#supplier_id').select2({});

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.js"></脚本><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="应用程序">{{供应商_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></选择>

I was working with select2 in vuejs , I found vuejs is not working with jquery select2 as vuejs is working with navite html.

I am using this code

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>

Please share your reply to handle this problem.

解决方案

To get this to work with a directive, we need to understand how v-model works. From the docs:

<input v-model="something">

is just syntactic sugar for:

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

In the case of a select element, v-model will listen for the change event (not input). So, if the directive dispatches a change event when the element changes, then v-model will work as expected.

Here is an updated version of your code (works in 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>

And here's a version that works in Vue 3 (custom directives have different syntax, 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>

这篇关于更改事件上的 Select2 在 Vuejs 中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
前端开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆