Я использую AngularJS для отображения карт Bing, но появляется сообщение об ошибке «TypeError: не удается прочитать свойство 'prototype', равное нулю». Пожалуйста, посмотрите ниже.
В моем представлении Razor файл имеет следующее:
<script type = "text/javascript" src = "http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0"></script>
<script type = "text/javascript" src = "~/lib/angular/angular.min.js"></script>
<script src = "~/js/Site.js"></script>
----
----
--
<div ng-app = "myDisplayItems">
<div ng-controller = "myDisplayItemsController">
<div id = "myMap"></div>
</div>
</div>
В моем файле JavaScript есть:
var displayItems = angular.module("myDisplayItems", []);
displayItems.controller("myDisplayItemsController", function myDisplayItemsController($scope) {
showMap();
});
function showMap() {
var key = "######";
var map = new Microsoft.Maps.Map('#myMap', {
credentials: key,
zoom: 3
});
}
Обновлять:
var displayItems = angular.module("myDisplayItems", []);
displayItems.controller("myDisplayItemsController", function myDisplayItemsController($scope) {
$scope.map = null;
$scope.init = function () {
$scope.map = showMap();
};
angular.element(document).ready(function () {
$scope.init();
});
});



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


По-видимому, эта ошибка возникает, поскольку библиотека Bing Maps имеет значение еще не готов после инициализации карты.
Ошибка не возникает, если функция showMap вызывается после некоторой задержки (при условии, что к этому моменту была загружена библиотека Bing Maps), например, так:
$timeout(function() { $scope.initMap()}, 2000);
Но я бы предложил следующее решение:
Зарегистрируйте функцию, которая должна запускаться после того, как библиотека Bing Maps будет готова, например:
Microsoft.Maps.CallbackOnLoad = "initMap";
и объявить initMap функцией Глобальный:
$window.showMap = function () {
//...
}
Демо
angular.module('mapApp', []);
angular
.module('mapApp')
.controller('MapController', MapController);
function MapController($scope, $window) {
$window.initMap = function () {
let map = new window.Microsoft.Maps.Map(
document.getElementById('myMap'), {
credentials: 'AjwUEXFZA8SMyy8CaJj59vJKVDoWohNXVFz_uGyHlT8N40Jgr-zrhvcxbTNRyDqn'
});
map.setView({
zoom: 6,
center: new Microsoft.Maps.Location(52.406978607177734, -1.5077600479125977)
});
}
Microsoft.Maps.CallbackOnLoad = "initMap";
}<script src = "//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"></script>
<script type = "text/javascript" src = "http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0"></script>
<div ng-app = "mapApp" ng-controller = "MapController">
<div id = "myMap" style = "width:600px;height:400px;"></div>
</div>Следуя вашему предложению, я могу показать карту. На следующем этапе будет использоваться вызов $ http для получения долготы и широты из базы данных MS SQL Server.
Спасибо за ответ. Мне понадобится время, чтобы понять, что вы имели в виду, потому что я все еще изучаю концепции JavaScript, Angular, Bing Maps и MVC.