Javascript google maps api的setMap()不工作

Javascript google maps api的setMap()不工作,javascript,google-maps,knockout.js,Javascript,Google Maps,Knockout.js,我正在使用Google Maps API构建地图,当我加载它时,会出现以下错误: 未捕获的TypeError:无法读取未定义的属性“setMap” 我认为vm()中的toggle()会导致错误,但我不知道如何更正它。 我的目标是基于搜索同时显示标记 代码如下: var位置=[ {“名称”:“马拉里海滩阿拉普扎”,“位置”:{“拉特”:9.618406,“液化天然气”:76.340161}, {“名称”:“茶博物馆”,“地点”:{“lat”:10.049198,“lng”:77.051025},

我正在使用Google Maps API构建地图,当我加载它时,会出现以下错误:

未捕获的TypeError:无法读取未定义的属性“setMap”

我认为vm()中的toggle()会导致错误,但我不知道如何更正它。 我的目标是基于搜索同时显示标记

代码如下:

var位置=[
{“名称”:“马拉里海滩阿拉普扎”,“位置”:{“拉特”:9.618406,“液化天然气”:76.340161},
{“名称”:“茶博物馆”,“地点”:{“lat”:10.049198,“lng”:77.051025},
{“名称”:“埃拉维库拉姆国家公园”,“位置”:{“拉特”:10.116233,“液化天然气”:77.067791},
{“名称”:“奇米尼野生动物保护区”,“位置”:{“lat”:10.428646,“lng”:76.491031},
{“名称”:“贝卡尔堡”,“位置”:{“拉特”:12.440895,“液化天然气”:75.030311}
]
var标记=[];
var映射;
变量布尔=[];

对于(i=0;i我没有解决方案,但我想向您展示一些可以大大简化JavaScript代码的方法

首先,我去掉了单独的
标记
布尔
数组。取而代之的是,最好将
位置
数组元素的属性设置为。毕竟,
位置
是您获取位置信息的地方,所以将所有信息放在那里。在新代码中,每个
位置
都是rray元素有一个
marker
属性(如果已经创建了一个标记)和一个
show
属性,该属性对应于前一个
boolean
数组元素。如果不必更新单独的数组,只需将所有信息保存在一个位置,事情就会简单得多

我用
forEach()
替换了两个
for
循环
forEach()
接受一个回调函数,这非常好,因为在本例中,它提供了传递给回调函数的
位置
参数的闭包。因此您不需要
marker.addListener()中的复杂代码
创建闭包-闭包已经存在

通过删除和组合重复代码,我简化了
toggle()
函数

这就是我现在所有的时间,但我希望它能给你一些东西来帮助你简化你的代码,因为简单的代码更容易理解和调试

var位置=[
{“名称”:“马拉里海滩阿拉普扎”,“位置”:{“拉特”:9.618406,“液化天然气”:76.34061},
{“名称”:“茶博物馆”,“地点”:{“lat”:10.049198,“lng”:77.051025},
{“名称”:“埃拉维库拉姆国家公园”,“位置”:{“拉特”:10.116233,“液化天然气”:77.067791},
{“名称”:“奇米尼野生动物保护区”,“位置”:{“lat”:10.428646,“lng”:76.491031},
{“名称”:“贝卡尔堡”,“位置”:{“拉特”:12.440895,“液化天然气”:75.030311}
];
var映射;
函数initMap(){
map=new google.maps.map(document.getElementById('map'){
缩放:7,
中心:{
纬度:10.850516,
液化天然气:76.271080
}
});
var标签='abcdefghijklmnopqrstuvxyz';
位置。forEach(函数(位置){
var marker=location.marker=new google.maps.marker({
位置:location.location,
动画:google.maps.animation.DROP
});
marker.addListener('click',function()){
if(marker.getAnimation()){
marker.setAnimation(null);
}否则{
marker.setAnimation(google.maps.Animation.BOUNCE);
停止动画(标记);
}
});
函数停止动画(标记){
setTimeout(函数(){
marker.setAnimation(null);
}, 3000 );
}
});
切换();
}
函数切换(){
位置。forEach(函数(位置){
if(location.marker){
location.marker.setMap(location.show?map:null);
}
});
}
var vm=函数(){
var self=这个;
self.loc=ko.observearray(位置);
self.query=ko.observable(“”);
self.filteredloc=ko.computed(函数(){
var z=0;
var filter=self.query().toLowerCase();
切换();
如果(!过滤器){
return self.loc();
}否则{
return ko.utils.arrayFilter(self.loc(),函数(项){
boolean[z]=item.name.toLowerCase().indexOf(filter)!=-1;
//log(boolean[z]+'in pos'+z);
z++;
return item.name.toLowerCase().indexOf(filter)!=-1;
});
}
});
}
ko.applyBindings(新vm());

邻里地图

邻里地图

  • (1)您从未调用
    show()
    hide()
    (2)这些函数中的缩进确实是一团糟。(3)这些函数中的每一个都无意中创建了一个全局变量
    g
    。您在每一个函数中都缺少一个
    var
    。(4)您应该添加
    “使用strict”;
    位于源文件顶部,以防止出现全局
    g
    (5)定义了
    位置和
    布尔值的地方?(6)
    布尔值应更改为更有意义的名称。(7)你能在你的问题中创建一个完整的、自包含的代码片段,包含运行和演示问题所需的所有HTML和JavaScript代码吗?抱歉@Michael Geary。我已经重构了代码。希望现在