使用带有 vuejs 指令的 select2,来自 html 的数据

Posted

技术标签:

【中文标题】使用带有 vuejs 指令的 select2,来自 html 的数据【英文标题】:Using select2 with vuejs directive, data from html 【发布时间】:2018-08-19 20:11:41 【问题描述】:

我尝试创建一个 vuejs2 指令,它将选择已经呈现的选择并将其包装到 select2 中。这部分正在工作,但没有选择选定的值:

Vue.directive('select', 
    inserted: function (el) 

        $(el).select2(
            matcher: modelMatcher,
            minimumResultsForSearch: 6,
            dropdownAutoWidth: true,
            width: 'auto'
        );

    
);

任何想法如何做到这一点?这可能适用于 vuejs 1:

https://gist.github.com/themsaid/c0548e19f247b832ac4f

但不再工作了。

【问题讨论】:

【参考方案1】:

问题是select2,更改后会抛出jQuery.Event Object,并且Vue 只对常规JavaScript 事件作出反应

所以解决方案是,在初始化 select2 之后,监听它发出的 change jQuery.Event 并发出一个 change CustomEvent ,所以 Vue 将其拾取。

当 Vue 选择 change CustomEvent 时,它会更新 v-model

下面的演示。

Vue.directive('select', 
  inserted: function(el) 
    var self = this;
    $(el).select2(
      //matcher: modelMatcher,
      //minimumResultsForSearch: 6,
      //dropdownAutoWidth: true,
      width: 'auto'
    ).on('change', function(e) 
      if (e.detail === "vue-directive") 
        return; // prevent stack overflow (i.e. listening to the event we threw ourselves)
      
      // throw regular change (non jQuery) event, so vue reacts
      el.dispatchEvent(new CustomEvent("change", 
        detail: "vue-directive"
      ));
      return false;
    )
  
);
new Vue(
  el: '#app',
  data: 
    states: ["AL", "AK", "AZ"],
    selectedState: "AK",
  
)
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<script src="https://unpkg.com/vue"></script>

<div id="app">
  <select v-model="selectedState" v-select>
    <option v-for="state in states" :value="state"> state </option>
  </select>
  <p>Selected State:  selectedState </p>
</div>

请注意,这只是一种方法,使用Vue's Custom Directives Hook Functions 有多种可能性。另请注意,我上面显示的示例比您提供的要点要简单得多,因为它不处理 unbind 钩子,例如。 OTOH,实现应该很简单。

【讨论】:

谢谢!我想要实现的更像是这样的:jsfiddle.net/mg4zr2Ly/4 但你的回答帮助我完成了它。

以上是关于使用带有 vuejs 指令的 select2,来自 html 的数据的主要内容,如果未能解决你的问题,请参考以下文章

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

Vuejs自定义select2指令

Vuejs 指令绑定模型

使用带有 select2 指令的 vue.js 方法

使用 Vuejs 填充特定输入 - 来自数据库的 Laravel

Select2:如何在 VueJS 的多选中添加选项搜索字段