我正在尝试使用jQuery geocomplete和Vue.js来填充带有地理数据的表单。
我的代码包含以下表单:
<form>
<label for="get-offer-location">location: </label><input id="get-offer-location" v-model="newoffer.location" type="text"/>
<div style="visibility:hidden">
<input name="lat" type="text" value=""/>
<input name="lng" type="text" value=""/>
</div>
</form>
点击get-offer-location输入中的建议位置后,看起来字段已填写 - 但是当我开始在另一个字段中输入时,位置输入字段将恢复为我输入的字母在进行位置搜索。点击“发布”,然后点击“新闻”或“优惠”,在此尝试: https://jsfiddle.net/dvdgdnjsph/157w6tk8/
谁能告诉我什么是错的?
答案 0 :(得分:2)
您遇到的问题是v-model
绑定input
,因为geolocation dropdown
是一个以编程方式更改值的插件,输入事件未被触发,因此{{1} }没有更新。作为一种情况,尝试在选择一个位置后键入一个空格,你会看到它坚持。
幸运的是,v-model
只不过是v-model
的语法糖,因此您可以使用v-on:input
来触发您的活动。考虑到您需要v-on
开箱即用,unfocus
事件可能是您的最佳选择,因此您可以这样做:
blur
不幸的是,JSFiddle不会让我保存或更新您的小提琴,但我确实让它使用上面的代码。
为了完整性,如果您想广泛使用此行为,并且因为Vue文档在这方面相当有限,您可以编写custom directive来封装代码:
v-on:blur="newarticle.location = $event.target.value"
然后你可以这样使用:
Vue.directive('model-blur', {
bind: function(el, binding, vnode) {
el.addEventListener('blur', function() {
vnode.context[binding.expression] = el.value;
});
}
});
这里是JSFiddle:https://jsfiddle.net/4vp6Lvmc/
答案 1 :(得分:1)
无法确定。但看起来jQuery插件只是改变输入#get-article-location值,而不是Vue模型。因此,当您触发模型更新(例如编辑标题)时,它会覆盖您输入的任何内容的完整位置。
答案 2 :(得分:1)
我有类似的东西来捕获geocomplete事件并尝试设置vueJS值:
$("#get-article-location")
.geocomplete({details: ".details"})
.bind("geocode:result", function (event, result) {
vm.newoffer.location = result.formatted_address;
console.log('done');
});
但是仍然出现了错误,我认为你应该真正改变你的vueJS实例的名称(var vm
),它可能会被另一个脚本使用并造成麻烦。
答案 3 :(得分:1)
这是因为v-model
作为双向绑定,在接收用户输入方式上,侦听输入元素上的input
事件,而js插件(如jquery-geocomplete)显然通过js设置输入值,这导致视图模型的data
没有像我们在其他答案中讨论的那样改变。
要解决此问题,只需听取插件的geocode:result
事件,然后手动更改data
代码(jsfiddle似乎有问题,所以我在这里发布):< / p>
var vueVM = this;
$("#get-offer-location").geocomplete({ details: ".details" });
$("#get-article-location")
.geocomplete({ details: ".details" })
/***** highlight start *****/
.bind("geocode:result", function(event, result){
console.log(result);
//tried result.something but couldn't find the the same thing as `this.value`
vueVM.newarticle.location = this.value;
});
/***** highlight end *****/
额外知识:上述v-model
机制通常用于制作可重复使用的组件,方法是从父级接收value
prop
并发出检测到组件中输入元素的更改时,具有用户输入值的input
事件。然后我们可以使用<my-component v-model='parentData'></my-component>
,因为孩子的行为与父母视角中的简单输入元素完全相同。 example