2

我正在使用谷歌地图 api 来显示一些信息窗口(谷歌地图气球窗口)。

var contentString = '<div id="content"><p>hello world</p></div>';
var infowindow = new google.maps.InfoWindow({
    content: contentString
});
//... add info window to google map object

当您单击地图标记时,这将在气球中显示“Hello world”。(地图标记是地图上的一个图标,就像您习惯的红色大头针一样。

我希望 infoWindow 的内容是动态的,所以我将contentString设置为:

"<div id='infoWindowContent' ngInclude='/Content/Static/MapPersonDetails.html'></div>";

当用户单击地图标记时,它会插入到页面的 DOM 中。为了完成这项工作,我必须编译上面的行,当它被插入到页面的 DOM 中时。

我正在使用一个抽象地图使用的指令,例如:

    <div class="google-map" 
         markers="markersProperty"
         on-Info-Window-Dom-Ready="onInfoWindowDomReady()">
    </div>

因此,当单击地图标记时,该指令将创建 infoWindow,订阅inforWindow的 domReadyEvent,显示 infoWindow,并将domReadyEvent 冒泡到页面控制器。

infoWindow 公开了一个我通过指令冒泡的domReady事件,我在我的页面控制器中执行以下操作:

        $scope.onInfoWindowDomReady = function () {
        $scope.$apply(function () {
            var element = document.getElementById("infoWindowContent");
            $compile(element)($scope);
        });
    };

我遇到的问题是我不喜欢我在控制器中进行的 dom 操作。有没有其他方法可以做到这一点?我应该将编译放在指令中吗?然后该指令将知道 infoWindow 内容是动态的并且必须进行编译,但并非所有信息窗口都如此。

要知道的重要一点是 infoWindow 内容也可以是 html 元素(与静态字符串相反),但我不知道这是否有任何帮助。

4

1 回答 1

0

使用 angular-ui 它变得像这样简单:

<div ng-controller="MapCtrl">
    <div ng-repeat="marker in myMarkers" ui-map-marker="myMarkers[$index]"
        ui-event="{'map-click': 'ClickOnMarker(marker)'}">
    </div>

    <div ui-map-info-window="myInfoWindow">
        <input type="text" ng-model="myText" required />
    </div>

    <div id="map_canvas" ui-map="myMap" class="map"
        ui-event="{'map-click': 'ClickMap($event)' }"
        ui-options="mapOptions">
    </div>
</div>

$scope.ClickOnMarker = function (marker) {
    $scope.myText = "Clicked on marker";
    $scope.myInfoWindow.open($scope.myMap, marker);    
};

$scope.ClickMap = function ($event) {
    var newMarker = new google.maps.Marker({
        map: $scope.myMap,
        position: $event.latLng,
        hasChanges: true,
        isSaved: false,
    });

    $scope.myMarkers.push(newMarker);
    $scope.myText = "Clicked on map";
    $scope.ClickOnMarker($scope.currentMarker);
};

希望能帮助到你!

于 2013-05-11T02:48:31.507 回答