javascript - 使用 Google Places API 和 KnockoutJS 列出地名
问题描述
我想检索 Google Places API 搜索返回的名称并使用 KnockoutJS 列出它们。
我想使用 Google Places API 搜索地点。我想在地图上标记这些地方,并使用 KnockoutJS 在无序列表中列出它们的名称。我能够将这些标记放在地图上,但无法使用 KnockoutJS 在无序列表中列出它们的名称。这是我的代码。
HTML:
<h4>Search Results<h4>
<ul class="binding" data-bind="foreach: placesArray">
<li class="binding" data-bind="text: $data">
<span class="binding" data-bind="text: $index"></span>
</li>
</ul>
JavaScript:
我发现极其困难的是我无法存储placesArray = getNames(results)
在全局变量placesArray
中。我认为如果我在本地添加 knockoutJS 可能会起作用,但ko.applyBindings
如果我第二次搜索会导致错误。
let placesArray;
function searchPlaces() {
let bounds = map.getBounds();
hideMarkers(placeMarkers);
let placesService = new google.maps.places.PlacesService(map);
let placeName = placeInput.value;
placesService.textSearch({
query: placeName, // placeName is a string like "restaurants"
bounds: bounds
}, function(results, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
createMarkers(results);
placesArray = getNames(results);
// placesArray is an array of strings like ["McDonalds", "KFC", "Wendy's",...], I want to list them in <li> //
}
});
}
function getNames(placesArray) {
let placeNamesArray = [];
for (let i=0; i < placesArray.length; i++) {
let name = placesArray[i].name;
placeNamesArray.push(name);
}
return placeNamesArray;
}
如果我在本地引入了 KnockoutJS,则名称会正确列出,但如果我第二次运行此函数,则仅列出一次。ko.applyBindings
将引发错误,因为我多次将绑定应用于相同的元素。
function searchPlaces() {
let bounds = map.getBounds();
hideMarkers(placeMarkers);
let placesService = new google.maps.places.PlacesService(map);
let placeName = placeInput.value;
placesService.textSearch({
query: placeName,
bounds: bounds
}, function(results, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
createMarkers(results);
let placesArray = getNames(results);
let SimpleListModel = function() {
this.placesArray = ko.observableArray(placesArray);
}
ko.applyBindings(new SimpleListModel());
}
});
}
解决方案
viewmodel 和 Knockout observable 的想法是,您可以在获得任何新信息时对其进行更新,并将其反映在 HTML 中。因此,您最初可以创建一个空的 observable,然后用您搜索的值填充它。
let SimpleListModel = function() {
this.placesArray = ko.observableArray();
}
let modelInstance = new SimpleListModel();
ko.applyBindings(modelInstance);
function searchPlaces() {
let bounds = map.getBounds();
hideMarkers(placeMarkers);
let placesService = new google.maps.places.PlacesService(map);
let placeName = placeInput.value;
placesService.textSearch({
query: placeName,
bounds: bounds
}, function(results, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
createMarkers(results);
let placesArray = getNames(results);
modelInstance.placesArray(placesArray);
}
});
}
推荐阅读
- asp.net-core - 如何使用本地 Active Directory 在 .Net Core 3.1 Razor Pages Web 应用程序中对用户进行身份验证
- javascript - 有没有办法在 keystone 初始化后在运行时创建 Keystone 列表?
- javascript - 忽略 JavaScript 副本上的子元素
- mongodb - 使用 $group 进行聚合以获取第一个元素(有条件)
- javascript - 在 REACT 中提升消息
- ansible - Ansible playbook 为目录中的每个子目录运行命令
- pandas - 根据 pandas 中的 groupby shift 创建新列
- javascript - (js) 使用 api 包装器编写异步函数
- php - PHP:无法使用 API 获取谷歌照片/相册
- android - Flutter ML 套件视觉无法检测到人脸