jQuery 和 Materialise 不更新 VueJS select 值
jQuery and Materialize not updating VueJS select value
当我使用 Materialize/jQuery and VueJS 的组合来创建 select,然后我尝试 select 所需的值时,VueJS 不会更新以反映新值那是 selected.
我认为这是 Materialise 的问题;但是,对于 VueJS,我根本无法获得触发 update/change 事件的值。
我所拥有的是在下面的代码片段中。我想要做的只是让 select - 或任何 select 在 jQuery.
更新时正确更新 VueJS
这似乎开始变得不可能了,尽管我知道得更多。
$('select').material_select();
$(document).on('change', function(e){
$('#live').text("\n Using JUST jquery... Notice that the vue option remains unchanged\n" + JSON.stringify({ 'selectShouldBe': $(e.target).val()}, null, ' '));
});
new Vue({
el: '.container',
data: {
'select':''
},
methods: {
updateThing: function(){
console.log(this);
}
},
})
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.5/css/materialize.css">
</head>
<body>
<div class="container">
<!-- here is the select in question -->
<select id='jurisdiction' v-model='select' @change="updateThing">
<option value disabled selected>Please select a value.</option>
<option value='1'>One</option>
<option value='2'>Two</option>
<option value='3'>Three</option>
<option value='4'>Four</option>
</select>
<!-- Print out the data, then pass it through json for easier readability. -->
<pre>
{{$data|json}}
<div id="live"></div>
</pre>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.12/vue.min.js"></script>
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.5/js/materialize.min.js">
</script>
</body>
</html>
有什么建议吗?
当我检查 运行 您的代码后的 DOM 时,Materialise 库似乎创建了一个新的下拉菜单。隐藏了原始下拉列表,即您将 Vue 侦听器附加到的下拉列表。然后 Materialise 创建了一个新的格式化下拉列表。因此,当您在那里更新值时,原始下拉列表将保持隐藏状态并且不会更新。因为你做了一个 document.on('change')
它无论如何都会被拾取,但我认为如果你做了一个 $('#jurisdiction').on('change')
监听器你会发现它永远不会触发。
我会查看 Materialize JS,看看我能找到什么,看来您需要使用 Materialize 库来触发事件并更新 Vue 组件。
虽然这可能不是一个理想的解决方案,但它可以绕过 select 元素的 Materializecss 重载。
这基本上把它们缝合在一起了。
$('select').material_select();
$(document).on('change', function(e){
$('#live').text("\n Using JUST jquery... Notice that the vue option remains unchanged\n" + JSON.stringify({ 'selectShouldBe': $(e.target).val()}, null, ' '));
});
var myVue = new Vue({
el: '.container',
data: {
select:''
},
methods: {
updateThing: function(){
console.log(this);
}
},
});
$('#jurisdiction').change(function(){ myVue.$set('select', $('#jurisdiction').val()); });
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.5/css/materialize.css">
</head>
<body>
<div class="container">
<!-- here is the select in question -->
<select id='jurisdiction' v-model='select' @change="updateThing">
<option value disabled selected>Please select a value.</option>
<option value='1'>One</option>
<option value='2'>Two</option>
<option value='3'>Three</option>
<option value='4'>Four</option>
</select>
<!-- Print out the data, then pass it through json for easier readability. -->
<pre>
{{$data|json}}
<div id="live"></div>
</pre>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.12/vue.min.js"></script>
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.5/js/materialize.min.js">
</script>
</body>
</html>
我对 materialize-css 和 vue js 也有类似的问题。经过一段时间的努力并使用 firebug 检查代码后,我意识到一切都很好......除了我在错误的地方调用了 $('select').material_select();
。
我在 app.js 文件的顶部发布了与您一样的声明。这里的问题是我们需要在您的 Vue 应用准备就绪时发出此命令。
就我而言,在应用程序的就绪功能中发出命令就可以了。
var vm = new Vue({
el:"#app",
data: function() {
options: ["Clayton","Mt Meigs","Birmingham","Helena","Grant"]
},
ready: function() {
$('select').material_select();
}})
确保首先包含 jQuery,然后是 materialize.js 和 Vue.js。一旦包含这些,使用上面的代码,它应该可以工作
我还看到,您没有在 DOM 级别有效地使用 Vue。您可以使用 Vue 指令 v-for 来填充您的 select 选项,如下所示:
<div class="input-field col s12 m5">
<select class="black-text">
<option value="" selected="">Source Location</option>
<option v-for="city in options" value="{{city}}">{{city}}</option>
</select>
</div>
把vuejs和它分开怎么样?
如果您可以使用 jquery 获得选择,那么您可以手动将值设置为 vue 实例,如:
var vm = new Vue({
el: '.container',
data: {
select: ''
}
});
$('select').material_select();
$('select').on('change', function(e){
vm.$set('select', ...)
});
我遇到的问题是 UI 上的具体化 select 下拉列表未使用 Vue 模型的值进行更新。另外,我无法以编程方式清除以前的 selection。但是下面的这段代码对我有用。最后的技巧是使用 Vue.nextTick(...) 函数。
HTML:
<select id="fooField" v-model="myObject.foo" onchange="MyVueElement.fooChanged(this)">
<option value="" disabled selected>Choose...</option>
<option value="A">a</option>
<option value="B">b</option>
<option value="C">c</option>
</select>
以及用于处理来自 UI 的新 selection 的 JS:
fooChanged: function(selectObject) {
this.myObject.foo = selectObject.value;
},
当我想 reset/clear select/dropdown 上 UI:
myObject.foo = ""; //setting this to null did not work
Vue.nextTick( function(){
$("#fooField").material_select();
});
当我使用 Materialize/jQuery and VueJS 的组合来创建 select,然后我尝试 select 所需的值时,VueJS 不会更新以反映新值那是 selected.
我认为这是 Materialise 的问题;但是,对于 VueJS,我根本无法获得触发 update/change 事件的值。
我所拥有的是在下面的代码片段中。我想要做的只是让 select - 或任何 select 在 jQuery.
更新时正确更新 VueJS这似乎开始变得不可能了,尽管我知道得更多。
$('select').material_select();
$(document).on('change', function(e){
$('#live').text("\n Using JUST jquery... Notice that the vue option remains unchanged\n" + JSON.stringify({ 'selectShouldBe': $(e.target).val()}, null, ' '));
});
new Vue({
el: '.container',
data: {
'select':''
},
methods: {
updateThing: function(){
console.log(this);
}
},
})
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.5/css/materialize.css">
</head>
<body>
<div class="container">
<!-- here is the select in question -->
<select id='jurisdiction' v-model='select' @change="updateThing">
<option value disabled selected>Please select a value.</option>
<option value='1'>One</option>
<option value='2'>Two</option>
<option value='3'>Three</option>
<option value='4'>Four</option>
</select>
<!-- Print out the data, then pass it through json for easier readability. -->
<pre>
{{$data|json}}
<div id="live"></div>
</pre>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.12/vue.min.js"></script>
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.5/js/materialize.min.js">
</script>
</body>
</html>
有什么建议吗?
当我检查 运行 您的代码后的 DOM 时,Materialise 库似乎创建了一个新的下拉菜单。隐藏了原始下拉列表,即您将 Vue 侦听器附加到的下拉列表。然后 Materialise 创建了一个新的格式化下拉列表。因此,当您在那里更新值时,原始下拉列表将保持隐藏状态并且不会更新。因为你做了一个 document.on('change')
它无论如何都会被拾取,但我认为如果你做了一个 $('#jurisdiction').on('change')
监听器你会发现它永远不会触发。
我会查看 Materialize JS,看看我能找到什么,看来您需要使用 Materialize 库来触发事件并更新 Vue 组件。
虽然这可能不是一个理想的解决方案,但它可以绕过 select 元素的 Materializecss 重载。
这基本上把它们缝合在一起了。
$('select').material_select();
$(document).on('change', function(e){
$('#live').text("\n Using JUST jquery... Notice that the vue option remains unchanged\n" + JSON.stringify({ 'selectShouldBe': $(e.target).val()}, null, ' '));
});
var myVue = new Vue({
el: '.container',
data: {
select:''
},
methods: {
updateThing: function(){
console.log(this);
}
},
});
$('#jurisdiction').change(function(){ myVue.$set('select', $('#jurisdiction').val()); });
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.5/css/materialize.css">
</head>
<body>
<div class="container">
<!-- here is the select in question -->
<select id='jurisdiction' v-model='select' @change="updateThing">
<option value disabled selected>Please select a value.</option>
<option value='1'>One</option>
<option value='2'>Two</option>
<option value='3'>Three</option>
<option value='4'>Four</option>
</select>
<!-- Print out the data, then pass it through json for easier readability. -->
<pre>
{{$data|json}}
<div id="live"></div>
</pre>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.12/vue.min.js"></script>
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.5/js/materialize.min.js">
</script>
</body>
</html>
我对 materialize-css 和 vue js 也有类似的问题。经过一段时间的努力并使用 firebug 检查代码后,我意识到一切都很好......除了我在错误的地方调用了 $('select').material_select();
。
我在 app.js 文件的顶部发布了与您一样的声明。这里的问题是我们需要在您的 Vue 应用准备就绪时发出此命令。
就我而言,在应用程序的就绪功能中发出命令就可以了。
var vm = new Vue({
el:"#app",
data: function() {
options: ["Clayton","Mt Meigs","Birmingham","Helena","Grant"]
},
ready: function() {
$('select').material_select();
}})
确保首先包含 jQuery,然后是 materialize.js 和 Vue.js。一旦包含这些,使用上面的代码,它应该可以工作
我还看到,您没有在 DOM 级别有效地使用 Vue。您可以使用 Vue 指令 v-for 来填充您的 select 选项,如下所示:
<div class="input-field col s12 m5">
<select class="black-text">
<option value="" selected="">Source Location</option>
<option v-for="city in options" value="{{city}}">{{city}}</option>
</select>
</div>
把vuejs和它分开怎么样?
如果您可以使用 jquery 获得选择,那么您可以手动将值设置为 vue 实例,如:
var vm = new Vue({
el: '.container',
data: {
select: ''
}
});
$('select').material_select();
$('select').on('change', function(e){
vm.$set('select', ...)
});
我遇到的问题是 UI 上的具体化 select 下拉列表未使用 Vue 模型的值进行更新。另外,我无法以编程方式清除以前的 selection。但是下面的这段代码对我有用。最后的技巧是使用 Vue.nextTick(...) 函数。
HTML:
<select id="fooField" v-model="myObject.foo" onchange="MyVueElement.fooChanged(this)">
<option value="" disabled selected>Choose...</option>
<option value="A">a</option>
<option value="B">b</option>
<option value="C">c</option>
</select>
以及用于处理来自 UI 的新 selection 的 JS:
fooChanged: function(selectObject) {
this.myObject.foo = selectObject.value;
},
当我想 reset/clear select/dropdown 上 UI:
myObject.foo = ""; //setting this to null did not work
Vue.nextTick( function(){
$("#fooField").material_select();
});