【问题标题】:Change event doesn't activate with VueJS 2 using Materialize CSS Select component使用 Materialize CSS Select 组件的 VueJS 2 不会激活更改事件
【发布时间】:2018-04-22 10:27:08
【问题描述】:

我正在尝试制作级联组合框,但遇到了一个问题:VueJS 没有看到 Materialize 选择元素的更改事件。这是我的代码:

let app = new Vue({
  el: '#app',
  data: {
    elements: [
      {'id' : 1, 'text' : 'Option 1'},
      {'id' : 2, 'text' : 'Option 2'}
    ]
  },

  updated() {
    $('select').material_select();
  },

  methods : {
    onChange() {
      alert('Option changed!');
    }  
  }
});

$('select').material_select();
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>
<script src="https://unpkg.com/vue"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css" rel="stylesheet"/>

<div class="container" id="app">
  <div class="row">
    <div class="input-field col s12 m6">
      <select name='somename' id='somename' @change='onChange()'>
        <option selected="" disabled="" value="">Choose your make</option>
        <option v-for="option in elements" :value="option.id">{{option.text}}</option>
      </select>
      <label>Car make</label>
    </div>
  </div>

  <select class="browser-default" name='somename' id='somename' @change='onChange()'>
    <option selected="" disabled="" value="">Choose your make</option>
    <option v-for="option in elements" :value="option.id">{{option.text}}</option>
  </select> 
</div>

如果更改 JS 代码以使用 jQuery 处理“更改”事件 - 它可以工作。

$('#somename').on('change', function(){alert('Changed - JQUERY')});

真的,不明白这里有什么问题。如果在纯 html 组件上执行该 vue 代码 - 它也可以。

【问题讨论】:

  • 问题在于 jQuery 事件和 Vue 事件是不同的东西。因此,materialize 在 select 元素上触发了一个“更改”事件,但这不是 Vue 正在监听的。正如panicoper 在他们的回答中所说,您可以创建一个包装器组件来连接功能。但是,如果您想在一个组件中实现所有的物化功能,那将会非常复杂。幸运的是,对于像这样的大多数常见库,已经有人实现了 Vue 包装器。在这种情况下:github.com/paulpflug/vue-materialize

标签: jquery vue.js materialize


【解决方案1】:

当你在这种情况下使用 jquery 和 vue 时,DOM 的操作是由 jquery 完成的,所以你会向 vue '发出'一个事件,然后 vue 可以实现视图或他的值的变化。对不起我的英语不好。

这里是 vuecodepen 文档中的一些示例

 mounted() {
    var self = this;//vue
      $('#vueSelect').material_select();
      $('#vueSelect').on('change', function () {            
        console.log("Change from Wrapper!", this.value)
        self.$emit("change", this.value)
      });
    self.$on("change", function(data){
       console.log('Option changed!', data);
      this.selected = data
    });       
  }

【讨论】:

  • 我已经在我的应用程序中实现了这个,它正在工作!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 2017-10-17
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多