AngularJS не может загрузить карты Bing

Я использую 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();
   });
});
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
449
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По-видимому, эта ошибка возникает, поскольку библиотека 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>

Спасибо за ответ. Мне понадобится время, чтобы понять, что вы имели в виду, потому что я все еще изучаю концепции JavaScript, Angular, Bing Maps и MVC.

Phil 21.08.2018 02:04

Следуя вашему предложению, я могу показать карту. На следующем этапе будет использоваться вызов $ http для получения долготы и широты из базы данных MS SQL Server.

Phil 23.08.2018 01:18

Другие вопросы по теме