【发布时间】:2015-08-12 16:39:05
【问题描述】:
在我使用 Google Maps InfoWindow 显示位置详细信息的项目中,我遇到了敲除绑定问题。我已经通过剔除 InfoWindow 的 HTML 内容来绑定所选位置的数据,这在开始时似乎工作正常。
现在的问题:一旦 InfoWindow 关闭(例如,通过按下 x 按钮),谷歌地图 从 DOM 中完全删除 html 内容并再次添加它,当 InfoWindow 是再次显示(例如单击下一个标记时)。
这里的问题是,一旦元素从 DOM 中删除,绑定就会丢失,因此内容不再更新。
知道如何将绑定重新应用到这个确切的元素吗?再次调用 ko.applyBindings() 会导致异常“您不能将绑定多次应用于同一元素”。
这里是 InfoWindow 内容的 HTML 元素:
<div id="info-content" data-bind="if:selectedPlace">
<div class="gm-iw gm-sm" data-bind="with:selectedPlace">
<div class="gm-title" data-bind="text:name"></div>
<div class="gm-basicinfo">
<div class="gm-addr" data-bind="text:vicinity"></div>
<div class="gm-website" data-bind="if:website"><a target="_blank" data-bind="attr: {href:website}, text:websiteText"></a></div>
<div class="gm-phone" data-bind="text:formatted_phone_number"></div>
</div>
<div class="gm-rev" >
<span data-bind="if:rating">
<span class="gm-numeric-rev" data-bind="text:rating"></span>
<div class="gm-stars-b">
<div class="gm-stars-f" data-bind="style: { width: getStarWidth } "></div>
</div>
</span>
<span data-bind="if:url"><a target="_blank" data-bind="attr: {href:url}">see more</a></span>
</div>
</div>
JS初始化函数和onClick函数:
// the initialize function gets called after ko.applyBindings(model)
ViewModel.prototype.initialize = function () {
... code to initialize map and search elements
// instantiate an InfoWindow
infoWindow = new google.maps.InfoWindow();
infoWindow.setContent(document.getElementById('info-content'));
...
}
// gets called for each place returned by the search,
// koPlace is the knockout observable for a place returned by the search,
// i is the index of the search result
function addMarker(koPlace, i) {
// create a marker
var m = new google.maps.Marker({
title: koPlace.name(),
position: koPlace.jsPlace.geometry.location,
animation: google.maps.Animation.DROP,
});
m.koPlace = koPlace;
koPlace.marker = m;
markers[i] = m;
google.maps.event.addListener(m, 'click', markerClicked);
setTimeout(dropMarker(i), i * 100);
}
function markerClicked() {
var koPlace = this.koPlace; // this refers to the marker object
if (koPlace) { // just checking
koPlace.selected(true); // this is used for highlighting.
model.selectedPlace(koPlace); // this should set the binding.
infoWindow.open(map, this);
}
}
【问题讨论】:
标签: javascript html google-maps knockout.js