Microsoft.Maps.Pushpin не отображается в приложении Dynamics 365 для телефона - PullRequest
1 голос
/ 03 августа 2020

В настоящее время я пытаюсь добавить pushpins на карту Bing в форме Dynamics 365.

Хотя все идет гладко как для компьютерных, так и для мобильных веб-версий, у меня возникла проблема с Dynamics 365 для телефона.

Я проверил мобильную опцию как на веб-ресурсе HTML, так и на форме, которую использую, поэтому моя проблема не связана с этим.

Это мой HTML файл:

<body onload="loadMap();">
  <div id="myMap"></div>
  <script type="text/javascript">
    function loadMap() {
      if (window.top.mainAddress== null) {
        setTimeout(loadMap, 300);
        return;
      }
      
      Microsoft.Maps.loadModule('Microsoft.Maps.Search', () => {
        let map = new Microsoft.Maps.Map(document.getElementById('myMap'), {
          mapTypeId: Microsoft.Maps.MapTypeId.aerial,
          zoom: 3
        });

        window.top.createMarker = (lat, lon, url) => {
          try {
            let marker = new Microsoft.Maps.Pushpin(new Microsoft.Maps.Location(lat, lon), {
              color: "blue"
            });
            Microsoft.Maps.Events.addHandler(marker, 'click', () => {
              window.open(url);
            });
            map.entities.push(marker);
            return true;
          }
          catch (exception) {
            return exception;
          }
        }

        let searchManager = new Microsoft.Maps.Search.SearchManager(map);
        let requestOptions = {
          bounds: map.getBounds(),
          where: window.top.mainAddress,
          callback: answer => {
            map.setView({ bounds: answer.results[0].bestView });
            map.entities.push(new Microsoft.Maps.Pushpin(answer.results[0].location, { color: "yellow" }));
          }
        };
        searchManager.geocode(requestOptions);
      });
    }
  </script>
  <script type="text/javascript" src="https://www.bing.com/api/maps/mapcontrol?key=XXX" async="" defer=""></script>
</body>

И мой JS файл с обеими функциями, вызываемыми при загрузке формы:

function getMainAddress(executionContext) {
  let formContext = executionContext.getFormContext();
  window.top.mainAddress = [
    formContext.getAttribute("address1_line1").getValue(),
    formContext.getAttribute("address1_postalCode").getValue(),
    formContext.getAttribute("address1_city").getValue(),
  ].filter(Boolean).join(' ');
}

function secondaryMarkers(executionContext) {
  if (window.top.createMarker == null) {
    setTimeout(() => secondaryMarkers(executionContext), 500);
    return;
  }

  Xrm.WebApi.retrieveMultipleRecords("lead", "?$select=address1_latitude,address1_longitude&$top=5").then((result) => {
    result.entities.forEach((lead) => {
      alert(window.top.createMarker(lead.address1_latitude, lead.address1_longitude, `https://XXX.crm.dynamics.com/main.aspx?pagetype=entityrecord&etn=lead&id=${lead.leadid}`));
    });
  }).catch((exception) => {
    alert(exception);
  });
}

Итак, вот как это должно работать (очевидно, в не -оптимальный способ, но сейчас я просто хочу, чтобы это сначала работало правильно): функция getMainAddress устанавливает значение window.top.mainAddress, пока loadMap ожидает. После того, как значение установлено, карта создается, функция createMarker тоже, и желтая кнопка, представляющая текущий отвод, добавляется к карте.

Эта часть фактически работает для обоих веб-версия динамика (на мобильных устройствах и ноутбуках) и приложение Dynamics 365 для телефона.

После этого функция secondaryMarkers вызывает функцию createMarker с координатами 5 других отведений.

Моя проблема в том, что эта функция выполняет alert(true) для каждой среды, но синие кнопки не отображаются в приложении Dynamics 365 для телефона, в то время как они видны в веб-версии (будь то на ноутбуке или на телефон).

Есть идеи, что я здесь делаю не так?

Возникает ли эта проблема из-за моего кода из приложения Dynamics?

Если первое, как добавить кнопки на карту Bing?

1 Ответ

1 голос
/ 04 августа 2020

Итак, после выполнения разных тестов кажется, что только первый элемент, помещенный в коллекцию map.entities, отображается в приложении Dynamics 365 для телефона.

В итоге я использовал Microsoft.Maps.EntityCollection, в котором я нажал кнопки, и это сработало.

...