Пользовательский Pushpin с содержимым угловой директивы на Bing Maps
Я использую элемент управления BJ Maps AJAX для отображения карты. И я создал угловую директиву для Pushpins, которую я хотел бы поместить на карту:
app.directive('myPin', function(){
return {
restrict: 'E',
templateUrl: '<p>{{title}}</p>'
}
})
в своем контроллере Angular я настраиваю карту и затем добавляю (а) Pin(s) к ней следующим образом:
// Define the title for the Pin
$scope.title = 'Test title';
// Define the location and the options for the Pin
var location = new Microsoft.Maps.Location(52.48, 13.42);
var pushpinOptions = {
width: null,
height: null,
htmlContent: '<my-pin></my-pin>'
};
// Push the Pin onto the map
map.entities.push(new Microsoft.Maps.Pushpin(location, pushpinOptions));
К сожалению, но, очевидно, также, мой пользовательский пин-код не отображается на карте, потому что часть "htmlContent" динамически вводится в DOM службой Bing. Я много пробовал с $compile сервисом Angular, но я не мог понять, как заставить его работать...
2 ответа
Мне удалось заставить это работать для инфобокса, я думаю, что он будет работать так же с канцелярской кнопкой. Обратите внимание, что это грубая рабочая копия, и для ее улучшения потребуется дополнительная работа. Это почти полностью сделано как можно дальше от углового пути. Я думал, что поделюсь наблюдением, так как никто не смог ответить на него так, как мне это помогло.
Я сделал это в два этапа: установить htmlContent
на пустой div с идентификатором:
Разметить шаблоны:
<div id="infoBox" style="display: none"><div id="infoboxText"></div></div>
<div id="infoBoxContents" style="display: none;"><b id="infoboxTitle" ng-bind="vm.searchResult"></b><p id="infoboxDescription">Select this address as the correct address? <button ng-click="vm.selectAddress()">Yes!</button></p></div>
Контроллер "Функция поиска успеха"
this.searchSuccess = function (geocodeResult, userData) {
...
this.map.entities.clear(); //remove existing infoboxes from the map
var template = $('#infoBox').html(); //<div id="infoboxText"></div>
var pin = new Microsoft.Maps.Pushpin(location, { draggable: false });
var infoboxOptions = {
pushpin: pin
};
var defaultInfobox = new Microsoft.Maps.Infobox(_this.map.getCenter(), infoboxOptions);
defaultInfobox.setHtmlContent(template);
this.map.entities.push(defaultInfobox); //add it to the map
this.addContentToInfobox();
}
this.addContentToInfobox = function() {
var rawContentHtml = $('#infoBoxContents').html();
$("#infoboxText").html(_this.$compile(rawContentHtml)(_this.$scope));
this.$scope.$apply();
}
FIDDLE: (требуется ключ API): http://jsfiddle.net/KyleMuir/m9ato59v/
Мне наконец удалось заставить это работать.
var devicePanel = '<div ng-include src=" \'/templates/Device/Map/_devicePanel.html\' "></div>'
var template = this.$compile(devicePanel)(this.$scope);
var pushPinItem;
for (var x = 0; x < this.map.entities.getLength(); x++) {
pushPinItem = this.entities.get(x);
if (pushPinItem instanceof Microsoft.Maps.Pushpin) {
pushPinItem.setOptions({ htmlContent: template[0].outerHTML });
}
}
Это работает для первоначального макета. Вам может понадобиться применить все изменения, чтобы убедиться, что шаблон обновлен.