【发布时间】:2017-08-09 15:25:55
【问题描述】:
我正在使用 Angular 2、打字稿和 YouTube API 构建一个 Web 应用程序,以便在用户登录后将播放器添加到页面。
所以一旦登录,应用就会加载以下组件:
export class MyComponent implements OnInit {
myService: MyService;
constructor( private _myService: MyService ) {
this.myService = _myService;
}
ngOnInit() {
this._myService.loadAPI();
}
}
组件html包含以下标签:
<iframe id="player" type="text/html" width="640" height="360"
src="http://www.youtube.com/embed/M7lc1UVf-VE?enablejsapi=1"
frameborder="0" allowfullscreen></iframe>
最后,该服务具有以下内容:
player: YT.Player;
loadAPI(){
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
console.log('API loaded'); // this is shown on the console.
}
onYouTubeIframeAPIReady(){
this.player = new YT.Player('player', {
events: {
'onReady': this.onPlayerReady,
'onStateChange': this.onPlayerStateChange
}
});
console.log('youtube iframe api ready!'); // this is never triggered.
}
onPlayerReady(event){
event.target.playVideo();
}
onPlayerStateChange(status){
console.log(status.data);
}
我了解到 API 会自动调用“onYouTubeIframeAPIReady”函数,所以我想知道我应该做些什么不同的事情才能让它正常工作。
【问题讨论】:
-
@AluanHaddad 我以前见过这个问题,我试图遵循它的逻辑,但是我无法将它适应打字稿,这就是为什么我在这里要求指定这些细节。
-
我不确定这与 TypeScript 有什么关系。如果它在 JavaScript 中工作,那么它在 TypeScript 中的工作方式相同。这完全扩展到范围,这似乎是这里的问题。不要将 TypeScript 视为 JavaScript 的替代品,这一点非常重要,因为它根本不是那种东西。
-
归结为 YouTube API 调用了一个名为
onYouTubeIframeAPIReady的全局函数。您在服务中定义的同名方法是完全任意的。 YouTube API 将如何调用该方法? -
@AluanHaddad 好的,我现在明白了,但是如何使用 typescript 使其全局化?
标签: angular typescript youtube-api youtube-iframe-api