编辑:阅读完@Ali Bahrami的asnwer
我在Vue 3项目中使用vue-google-autocomplete。它工作正常,提供地址,并允许我选择一个地址,我能够挑选选定的,并保存到数据库。这是<vue-google-autocomplete>
的代码
<vue-google-autocomplete
ref="autoCompleteAddress"
id="location"
classname="form-control"
placeholder="Location"
v-on:placechanged="getAddressData"
country="ca"
>
</vue-google-autocomplete>
字符串
稍后,我想显示我保存在数据库中的地址(例如:1 Bloor Street,Toronto')in the <vue-google-autocomplete>
.但是,我不能这样做。我在mounted()中尝试了以下代码。(我使用选项API)
this.$nextTick(() => {
let location = document.getElementById("location");
console.log("typeof location " + typeof location);
// It enters 'else'
if (location) {
location.value = "1 Bloor Street, Toronto";
} else {
console.log("location does not exist 0 ");
}
if (typeof location === 'object') {
// location.value = "1 Bloor Street, Toronto";
// Results in error: Uncaught TypeError: Cannot set properties of null (setting 'value')
} else {
console.log("location does not exist 1");
}
console.log(typeof this.$refs["autoCompleteAddress"]);
if (this.$refs["autoCompleteAddress"]) {
this.$refs["autoCompleteAddress"].update(
"1 Bloor Street, Toronto"
);
} else {
console.log('this.$refs["autoCompleteAddress"] does not exits');
}
// For testing
setTimeout(
function () {
let location = document.getElementById("location");
console.log("typeof location in setTimeout" + typeof location);
if (location) {
location.value = "1 Bloor Street, Toronto";
} else {
console.log("location does not exist in setTimeout");
}
}.bind(this),
1000
);
});
型
这是我在console中看到的输出:
typeof location object
location does not exist 0
undefined
this.$refs["autoCompleteAddress"] does not exits
typeof location in setTimeoutobject
location does not exist in setTimeout
型
令人惊讶的是,第一个if的真实测试失败了(if (location)
)。如果我强制document.getElementById("location").value = '1 Bloor Street, Toronto';
命令显示错误:**createEvent.vue:545 Uncaught TypeError:无法在代理上设置null属性(设置'value')。**令人惊讶的是,当我在控制台中使用相同的命令时,它可以工作并更新vue-auto-complete
文本框。类似地,我得到错误“Uncaught TypeError:Cannot read properties of undefined(阅读'update')”for this.$refs["autoCompleteAddress"].update('1 Bloor Street, Toronto')
.而且,令人惊讶的是,这个命令也可以在控制台中工作。
为了测试的目的,我尝试更新'位置'后1000米秒,然而,它仍然失败.
我很困惑--为什么if (location)
失败,我无法更改location.value
,尽管它在控制台中工作。
任何建议,如何解决这个问题?先谢了。
2条答案
按热度按时间8hhllhi21#
或者像这样的东西
字符串
我假设你使用的是
script setup
。在vue 3 composition API中,this
关键字不再使用。查看代码并通知任何需要的更改。
希望这有帮助!
lbsnaicq2#
由于我能够通过控制台使用
location.value
更新位置值,因此这似乎是一个时序问题。因此,我尝试了setTimeout(),似乎在大约1500毫秒后,“location.value”开始工作。为了安全起见,我使用了2.5秒的延迟,如mounted()中所示。字符串
我没有对延迟进行硬编码,而是使用了一个500毫秒的计时器。我检查'location'是否在计时器事件中可用。一旦位置可用,我就停止计时器并使用
location.value
更新地址。我注意到,在我的Mac上运行的服务器上,需要2到3个周期(500毫秒)才能准备就绪,但在AWS上运行的服务器上要快得多。