Angular 模板不使用';不知道窗口中更新的变量的变化
视图无法更新Angular 模板不使用';不知道窗口中更新的变量的变化,angular,Angular,视图无法更新status变量的值 这是我的代码摘录,删除了不相关的代码: 组件。ts export class MyComponent implements OnInit { private status: string; ngOnInit() { this.status = "abc"; // OK binding window['onYouTubeIframeAPIReady'] = (e) => { this.playe
status
变量的值
这是我的代码摘录,删除了不相关的代码:
组件。ts
export class MyComponent implements OnInit {
private status: string;
ngOnInit() {
this.status = "abc"; // OK binding
window['onYouTubeIframeAPIReady'] = (e) => {
this.player = new window['YT'].Player('player', {
videoId: this.video.videoId,
events: {
'onStateChange': this.onPlayerStateChange.bind(this)
}
});
};
}
onPlayerStateChange(event) {
switch (event.data) {
case window['YT'].PlayerState.PLAYING:
this.status= "xyz"; //Not possible binding
break;
}
component.html
<span>{{status}}</span> // it shows only abc, the expected is xyz
{{status}}//仅显示abc,预期为xyz
任何人都知道如何更新
窗口中的变量,它会反映在视图上 更改:私有状态:字符串代码>
至公共状态:字符串代码>
声明的变量必须是公共的,模板才能访问它们。这里的解释很好:我完全改变了我以前的答案,因为在你的情况下这似乎不是问题
我不确定为什么属性没有在模板上更新
,但是ts
中的值发生了更改-我认为可能是窗口
函数问题
经过一些研究,我已经手动触发了onPlayerStateChange(事件)
在构造函数中注入ChangeDetectorRef
构造函数(私有dect:ChangeDetectorRef){}
添加this.dect.detectChanges()代码>更改属性后-查看下面的代码
onPlayerStateChange(event) {
switch (event.data) {
case window['YT'].PlayerState.PLAYING:
this.name = "yyy";
this.dect.detectChanges(); //this will manually trigger the changes on your properties
console.log("I'm playing");
break;
};
}
希望它能起作用,解决方案可能不是一种传统的方法,但您可以将其用作一种变通方法-愉快的编码:)此外,测试变量changethis.name='yyy'代码>,最好通过单击按钮或设置超时(()=>{this.name='yyy';},0)来完成代码>它应该修复它,确保您正在测试状态的变化
变量OK。尝试使用setTimeout
而不是onPlayerStateChange(event)
函数。如果这不起作用,我建议设置一个Plunkr,这样我们就可以评估完整的代码:)哈,真的。setTimeout确实改变了模板中的变量:-所以你的问题似乎是YouTube事件的范围问题..像Rahul一样注入ChangeDetectorRef也意味着下面将解决它:你是否尝试过生命周期钩子扫描你用视频示例进行了stackblitz?窗口.onload
示例不起作用,因为未触发事件(请参阅)。设置事件处理程序时,该窗口可能已加载。window.onload
仍然不工作,即使使用setTimeout
,因为未执行事件处理程序。您可以使用控制台.log
对其进行测试。那么,回到我最初的问题:您能为视频案例提供stackblitz吗?没问题-:)