2013-12-20 86 views
0

你好,我正试图将谷歌地图与Knockout脚本绑定。 几乎所有的工作,但我不能强迫infowindows出现在事件。 没有敲出我的代码的作品,但它没有。 下面我的js代码:InfoWindow没有显示

var infowindow; 
function point(name, lat, long) { 
    this.name = name; 
    this.lat = ko.observable(lat); 
    this.long = ko.observable(long); 
    var marker = new google.maps.Marker({ 
     position: new google.maps.LatLng(lat, long), 
     title: name, 
     map: map, 
     draggable: true 
    }); 
//if you need the poition while dragging 
google.maps.event.addListener(marker, 'drag', function() { 
    var pos = marker.getPosition(); 
    this.lat(pos.lat()); 
    this.long(pos.lng()); 
}.bind(this)); 

//if you just need to update it when the user is done dragging 
google.maps.event.addListener(marker, 'dragend', function() { 
    var pos = marker.getPosition(); 
    this.lat(pos.lat()); 
    this.long(pos.lng()); 
}.bind(this)); 
google.maps.event.addListener(marker, 'mouseover', function() { 
    infowindow = new google.maps.InfoWindow({ content: "empty" }); 
    console.log("mouseover"); 
    infowindow.setContent(this.title); 
    infowindow.open(map, this); 

}.bind(this)); 


} 

var map = new google.maps.Map(document.getElementById('googleMap'), { 
    zoom: 5, 
    center: new google.maps.LatLng(55, 11), 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
}); 

var viewModel = { 
    points: ko.observableArray([ 
     new point('Test1', 55, 11), 
     new point('Test2', 56, 12), 
     new point('Test3', 57, 13)]) 

}; 
function addPoint() { 
    viewModel.points.push(new point('a', 58, 14)); 
} 
ko.applyBindings(viewModel); 

现在我的问题:

是简单的方法,使它的工作原理。如果是的话,任何人都可以建议我在哪里寻找它?

回答

1

可能是您使用this

添加var self = this;作为点函数内的第一行&使用self来引用点内的属性。

在鼠标悬停事件中,这是否引用标记,地图或视图模型?如果拖动事件正确设置了值,那么这就是点视图模型,在这种情况下,在您称为this.title的鼠标悬停事件中。没有标题...

function point(name, lat, long) { 
    var self = this; 
    self.name = name; 
    self.lat = ko.observable(lat); 
    self.long = ko.observable(long); 
    var marker = new google.maps.Marker({ 
     position: new google.maps.LatLng(lat, long), 
     title: name, 
     map: map, 
     draggable: true 
    }); 
    //if you need the poition while dragging 
    google.maps.event.addListener(marker, 'drag', function() { 
     var pos = marker.getPosition(); 
     self.lat(pos.lat()); 
     self.long(pos.lng()); 
    }.bind(this)); 

    //if you just need to update it when the user is done dragging 
    google.maps.event.addListener(marker, 'dragend', function() { 
     var pos = marker.getPosition(); 
     self.lat(pos.lat()); 
     self.long(pos.lng()); 
    }.bind(this)); 
    google.maps.event.addListener(marker, 'mouseover', function() { 
     infowindow = new google.maps.InfoWindow({ content: "empty" }); 
     console.log("mouseover"); 
     infowindow.setContent(marker.title); 
     infowindow.open(map, this); 
    }.bind(this)); 
} 
+0

你说得对。没有这个.title。在更改为this.name并使用console.log()后,我可以看到它显示出好名字,但仍然没有infoWindow。所以知道我确定这个问题在这一行:infowindow.open(map,this); – szpic