我正在为Power BI创建自定义视觉,并希望在插件中包含Bing Maps功能。但是,我无法在自定义视觉的javascript类中初始化Bing maps脚本。
这是实现IVisual的类的构造函数的基本代码:
constructor(options: VisualConstructorOptions) {
console.log('Visual constructor', options);
const initializer = () => {
if (typeof document !== "undefined") {
//map setup
const mapContainerDiv: HTMLElement = document.createElement("div");
options.element.appendChild(mapContainerDiv);
mapContainerDiv.id = options.element.id + "_mapDiv";
const map = new Microsoft.Maps.Map("#" + mapContainerDiv.id,{
credentials: "xxx-my-key-xxx"
});
}
};
const mapScript: HTMLScriptElement = document.createElement("script");
mapScript.addEventListener("load", event => initializer());
mapScript.async = true;
mapScript.defer = true;
mapScript.src = "https://www.bing.com/api/maps/mapcontrol?callback=GetMap";
options.element.appendChild(mapScript);
}
以上使用load事件的代码不起作用,因为我不断从mapcontrol javascript中收到以下错误:
“未捕获的TypeError:无法读取null的属性'prototype'。”
在谷歌搜索时,似乎使用加载事件不适用于最新版本的必应地图,因此必须采用另一种方法。
然后我注释掉了将事件侦听器添加到mapScript标记的行,并将mapScript src行更改为以下行,以便使用Bing Maps推荐的触发回调的方式:
mapScript.src = "https://www.bing.com/api/maps/mapcontrol?callback=initializer";
从不调用回调函数。
然后我尝试将初始化函数移到构造函数之外,并将其声明为类的公共字段,但这也不起作用。
在这种情况下初始化Bing地图的正确方法是什么?我所见过的所有文档都表明,您必须在全局范围或页面上的脚本标签中为Bing maps脚本URL创建回调,但是在Power BI自定义视图中,我只能操作自定义javascript实现IVisual的类。 Power BI中Microsoft的默认地图插件使用Bing Maps作为引擎,因此我知道一定有可能实现,我只是不确定采用哪种方法。