Как добавить Bing Maps v8 в Angular 2.0?
Я хочу добавить элемент управления Bing Map V8 в мой проект Anguar 2.0. Я хочу знать, что мне нужно сделать, чтобы добавить Bing Map V8 в проект Angular 2.0. Я приложил свою реализацию. Не удалось загрузить созданный компонент. Как я могу ссылаться на Microsoft.Карты.Карта?
вот пример карты bing v8. Все работает хорошо, если сохранить следующий пример как HTML. Ключ карты bing был обрезан.
<!DOCTYPE html>
<html>
<head>
<title>addOneLayerItemHTML</title>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
</head>
<body>
<div id='printoutPanel'></div>
<div id='myMap' style='width: 100vw; height: 100vh;'></div>
<script type='text/javascript'>
function loadMapScenario() {
var map = new Microsoft.Maps.Map(document.getElementById('myMap'), {
credentials: 'My Bing Map Key - I removed here'
});
var pushpin = new Microsoft.Maps.Pushpin(map.getCenter(), null);
var layer = new Microsoft.Maps.Layer();
layer.add(pushpin);
map.layers.insert(layer);
}
</script>
<script type='text/javascript' src='http://www.bing.com/api/maps/mapcontrol?branch=experimental&callback=loadMapScenario' async defer></script>
</body>
</html>
Her-это файл, который я создал как карта.деталь.формат html.
<div class='panel panel-primary'>
<div class='panel-heading'>
{{pageTitle}}
</div>
<div id='myMap' style='width: 100vw; height: 100vh;'></div>
</div>
вот файл, который я создал как map.деталь.ts.
import { Component, OnInit } from 'angular2/core';
@Component({
selector: 'pm-map',
templateUrl: 'app/bingmap/map.component.html'
})
export class MapComponent implements OnInit {
public pageTitle: string = "Map";
var map = new Microsoft.Maps.Map(document.getElementById('myMap'), {
credentials: 'Bing Map Key - I removed it here'
});
var pushpin = new Microsoft.Maps.Pushpin(map.getCenter(), null);
var layer = new Microsoft.Maps.Layer();
layer.add(pushpin);
map.layers.insert(layer);
}
3 ответов
ваш код почти в порядке, вам просто нужно несколько модификаций
1 - в index.html
удалите функцию обратного вызова и div
<div id='myMap' style='width: 100vw; height: 100vh;'></div>
<script type='text/javascript'>
function loadMapScenario() {
var map = new Microsoft.Maps.Map(document.getElementById('myMap'), {
credentials: 'My Bing Map Key - I removed here'
});
var pushpin = new Microsoft.Maps.Pushpin(map.getCenter(), null);
var layer = new Microsoft.Maps.Layer();
layer.add(pushpin);
map.layers.insert(layer);
}
</script>
кроме того, в index.html
удалить callback
параметр из импорта скрипта.
<script type='text/javascript' src='http://www.bing.com/api/maps/mapcontrol?branch=experimental&callback=loadMapScenario' async defer></script>
для:
<script type='text/javascript' src='http://www.bing.com/api/maps/mapcontrol?branch=experimental' async defer></script>
теперь у вас есть скрипт загружен, все, что вам нужно сделать, это создать карту в компоненте
@Component({
selector: 'pm-map',
template: `
<div class='panel panel-primary'>
<div class='panel-heading'>
{{pageTitle}}
</div>
<div #myMap style='width: 100%; height: 500px;'></div>
</div>`
})
export class MapComponent implements OnInit {
@ViewChild('myMap') myMap; // using ViewChild to reference the div instead of setting an id
public pageTitle: string = "Map";
ngAfterViewInit(){ // after the view completes initializaion, create the map
var map = new Microsoft.Maps.Map(this.myMap.nativeElement, {
credentials: 'Bing Map Key - I removed it here'
});
var pushpin = new Microsoft.Maps.Pushpin(map.getCenter(), null);
var layer = new Microsoft.Maps.Layer();
layer.add(pushpin);
map.layers.insert(layer);
}
}
я сначала попробовал принятый ответ и столкнулся с проблемой, которую некоторые люди имели в комментариях, где при загрузке "прототип" был нулевым.
Я изначально решил это, используя try / catch с setTimeout в catch, который попытается загрузить bing через секунду. Это сработало, но было очень небрежным решением.
в конце концов я искал, как люди загружали Карты Google в angular, чтобы увидеть, есть ли лучшее решение. К счастью, есть и он использует обещания.
решение, которое сработало для меня, было найдено здесь в этой ответ. Вся заслуга в этом принадлежит им.
сначала создайте сервис для загрузки карты...
карта-погрузчик-услуги.сервис
import { Injectable } from '@angular/core';
const url = 'http://www.bing.com/api/maps/mapcontrol?callback=__onBingLoaded&branch=release';
@Injectable()
export class BingMapsLoader {
private static promise;
public static load() {
// First time 'load' is called?
if (!BingMapsLoader.promise) {
// Make promise to load
BingMapsLoader.promise = new Promise( resolve => {
// Set callback for when bing maps is loaded.
window['__onBingLoaded'] = (ev) => {
resolve('Bing Maps API loaded');
};
const node = document.createElement('script');
node.src = url;
node.type = 'text/javascript';
node.async = true;
node.defer = true;
document.getElementsByTagName('head')[0].appendChild(node);
});
}
// Always return promise. When 'load' is called many times, the promise is already resolved.
return BingMapsLoader.promise;
}
}
на родительский компонент для компонента, содержащего элемент карты bing, есть этот код...
import { BingMapsLoader } from './services/map-loader-service/map-loader-service.service';
export class BingMapParentComponent {
mapReady = false;
constructor() {
BingMapsLoader.load()
.then(res => {
console.log('BingMapsLoader.load.then', res);
this.mapReady = true;
});
}
}
кроме того, в шаблон родительского компонента этот код будет препятствовать инициализации компонента Bing maps до тех пор, пока он не будет готов.
<app-bing-map *ngIf='mapReady'></app-bing-map>
теперь, в bing-map.компонент сам мы хотим подождать, пока компонент не будет в DOM перед загрузкой карты.
ngOnInit() {
if (typeof Microsoft !== 'undefined') {
console.log('BingMapComponent.ngOnInit');
this.loadMap();
}
}
и, наконец, вы загружаете карту Bing в bing-map.компонент
loadMap() {
this.map = new Microsoft.Maps.Map(document.getElementById('mapId'), {
credentials: 'Your Bing Maps Key Here',
});
}
существует попытка сообщества создать директивы Angular2 для карт Bing. Все еще в альфа-версии, но базовую демонстрацию можно найти здесь:http://ng2-bingmaps.azurewebsites.net/
РЕПО Github здесь:https://github.com/youjustgo/ng2-bingmaps