Bootstrap vue select 发送旧值
Bootstrap vue select sending old value
我得到了这个 select 基于 vue 的代码 bootstrap:
<b-form-select v-model="selectedgroup" class="mb-3" @change="searchSubGroup()">
<option :value="null">Select a group</option>
<option v-for="group in groupItem" :value="group.id">
{{group.nome}}
</option>
</b-form-select>
当@change 事件调用searchSubGroup()
方法时,@change 事件传递旧值selectedgroup
。示例:如果我首先单击值 = 1 的选项,该方法将调用 selectedgroup
作为 null
,然后如果我再次单击另一个值 = 2 的选项,该方法将调用 selectedgroup
作为 1.
searchSubGroup(){
this.axios.get("http://chart.solutions/public/api/produto/subgroup/search/" + this.selectedgroup + "/").then(response => {
if (response.data.erro) {
//console.log("subgroup doesnt exist")
}else{
this.subGroupItem = response.data;
}
})
}
您需要从 @change 调用中删除 () 这样:
@change="searchSubGroup"
如果您保留 () 集,则在构建组件时调用该函数并且 "selectedgroup" 仍未定义,因此调用 null
v-model 基于 @change 工作,所以事件被触发了两次。 selectedGroup 方法在更新 v-model 数据的 change 方法之前被调用。这就是为什么值为 "old one".
尽管其他答案仍然是避免问题的正确方法,但它并不能准确解释为什么会发生这种情况。
这是另一个解决方案:
- 从 b 表单中删除您的 @change 调用-select
添加一个"watched"属性
watch: {
selectedgroup(value) {
this.searchSubGroup();
//OR you could remove the method and just call axios here
})
}
您应该调用不带括号的 searchSubGroup
方法。这将自动将新选择的值传递给您的方法..
<b-form-select v-model="selectedgroup" class="mb-3" @change="searchSubGroup">
<option :value="null">Select a group</option>
<option v-for="group in groupItem" :value="group.id">
{{group.nome}}
</option>
</b-form-select>
然后在您的方法中您应该执行以下操作..
searchSubGroup(value){
this.axios.get("http://chart.solutions/public/api/produto/subgroup/search/" + value + "/").then(response => {
if (response.data.erro) {
//console.log("subgroup doesnt exist")
}else{
this.subGroupItem = response.data;
}
})
}
您可以使用 @input
而不是 @change
事件,因为 @input="searchSubGroup"
returns 当前选择的项目
new Vue({
el: '#app',
data() {
return {
selected: null,
options: [{
value: null,
text: 'Please select some item'
},
{
value: 'a',
text: 'This is option a'
},
{
value: 'b',
text: 'Default Selected Option b'
},
{
value: 'c',
text: 'This is option c'
},
{
value: 'd',
text: 'This one is disabled',
disabled: true
},
{
value: 'e',
text: 'This is option e'
},
{
value: 'e',
text: 'This is option f'
}
]
}
},
methods: {
choose() {
console.log(this.selected)
}
}
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="style.css">
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css" />
<!-- Add this after vue.js -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<script src="//unpkg.com/babel-polyfill@latest/dist/polyfill.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<script src="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>
</head>
<body>
<div id="app">
<b-form-select v-model="selected" :options="options" class="mb-3" @input="choose">
</b-form-select>
<div>Selected: <strong>{{ selected }}</strong></div>
</div>
<script src="script.js"></script>
</body>
</html>
我得到了这个 select 基于 vue 的代码 bootstrap:
<b-form-select v-model="selectedgroup" class="mb-3" @change="searchSubGroup()">
<option :value="null">Select a group</option>
<option v-for="group in groupItem" :value="group.id">
{{group.nome}}
</option>
</b-form-select>
当@change 事件调用searchSubGroup()
方法时,@change 事件传递旧值selectedgroup
。示例:如果我首先单击值 = 1 的选项,该方法将调用 selectedgroup
作为 null
,然后如果我再次单击另一个值 = 2 的选项,该方法将调用 selectedgroup
作为 1.
searchSubGroup(){
this.axios.get("http://chart.solutions/public/api/produto/subgroup/search/" + this.selectedgroup + "/").then(response => {
if (response.data.erro) {
//console.log("subgroup doesnt exist")
}else{
this.subGroupItem = response.data;
}
})
}
您需要从 @change 调用中删除 () 这样:
@change="searchSubGroup"
如果您保留 () 集,则在构建组件时调用该函数并且 "selectedgroup" 仍未定义,因此调用 null
v-model 基于 @change 工作,所以事件被触发了两次。 selectedGroup 方法在更新 v-model 数据的 change 方法之前被调用。这就是为什么值为 "old one".
尽管其他答案仍然是避免问题的正确方法,但它并不能准确解释为什么会发生这种情况。
这是另一个解决方案:
- 从 b 表单中删除您的 @change 调用-select
添加一个"watched"属性
watch: { selectedgroup(value) { this.searchSubGroup(); //OR you could remove the method and just call axios here }) }
您应该调用不带括号的 searchSubGroup
方法。这将自动将新选择的值传递给您的方法..
<b-form-select v-model="selectedgroup" class="mb-3" @change="searchSubGroup">
<option :value="null">Select a group</option>
<option v-for="group in groupItem" :value="group.id">
{{group.nome}}
</option>
</b-form-select>
然后在您的方法中您应该执行以下操作..
searchSubGroup(value){
this.axios.get("http://chart.solutions/public/api/produto/subgroup/search/" + value + "/").then(response => {
if (response.data.erro) {
//console.log("subgroup doesnt exist")
}else{
this.subGroupItem = response.data;
}
})
}
您可以使用 @input
而不是 @change
事件,因为 @input="searchSubGroup"
returns 当前选择的项目
new Vue({
el: '#app',
data() {
return {
selected: null,
options: [{
value: null,
text: 'Please select some item'
},
{
value: 'a',
text: 'This is option a'
},
{
value: 'b',
text: 'Default Selected Option b'
},
{
value: 'c',
text: 'This is option c'
},
{
value: 'd',
text: 'This one is disabled',
disabled: true
},
{
value: 'e',
text: 'This is option e'
},
{
value: 'e',
text: 'This is option f'
}
]
}
},
methods: {
choose() {
console.log(this.selected)
}
}
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="style.css">
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css" />
<!-- Add this after vue.js -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<script src="//unpkg.com/babel-polyfill@latest/dist/polyfill.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<script src="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>
</head>
<body>
<div id="app">
<b-form-select v-model="selected" :options="options" class="mb-3" @input="choose">
</b-form-select>
<div>Selected: <strong>{{ selected }}</strong></div>
</div>
<script src="script.js"></script>
</body>
</html>