通常在一个普通的javascript站点中,我可以使用以下脚本引用google maps api,并使用callback
设置initMap
函数。<script async defer src="https://maps.googleapis.com/maps/api/js?callback=initMap"></script>
我观察到的是普通javascript站点中的initMap
函数在窗口范围内,它可以在脚本参数设置-?callback=initMap
中引用,但是一旦我使用名为initMap
的组件方法在angular2中编写了一个组件,initMap
将在我的组件范围内。然后,我在索引中设置的异步加载脚本将无法捕获我的组件initMap
方法。
具体来说,我想知道如何在Angular2
中实现同样的目标?
注:我知道在angular2-google-maps
viaalpha
中有一个npm
组件可用,但它目前的功能有限,所以我想知道如何在不使用其他组件的情况下更轻松地加载它,这样我就可以使用google maps api来实现我的项目。
最佳答案
我知道你不需要其他的组件,但是polymer的组件可以很好地与googleapi一起工作。我有一个Angular2代码,它使用了Polymer YouTube数据API。我有人帮我安装。这是让我开始的plunker。我想硬的部分是为回调准备的,我相信你可以不用聚合物。这个例子显示了一个角度服务用来连接所有东西的棘手部分。
const url = 'https://apis.google.com/js/client.js?onload=__onGoogleLoaded'
export class GoogleAPI {
loadAPI: Promise<any>
constructor(){
this.loadAPI = new Promise((resolve) => {
window['__onGoogleLoaded'] = (ev) => {
console.log('gapi loaded')
resolve(window.gapi);
}
this.loadScript()
});
}
doSomethingGoogley(){
return this.loadAPI.then((gapi) => {
console.log(gapi);
});
}
loadScript(){
console.log('loading..')
let node = document.createElement('script');
node.src = url;
node.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(node);
}
}