将范围从窗口更改为角度视图

时间:2017-10-16 19:04:47

标签: javascript angular typescript ecmascript-6

我必须与使用iframe的供应商集成。 JS侦听iframe发出的事件。在我的Angular组件中,我有:

ngOnInit() {
 let listener = window.addEventListener ? "addEventListener" : "attachEvent";
 let listen = window[listener];
 let messageEvent = listener == "attachEvent" ? "onmessage" : "message";
 listen(messageEvent, function(e) {
  if (e.origin == 'someURL') {
    console.log(e.data)
    this.doStuff(e.data);
  }
}, false);
}

doStuff(data){
 //do stuff
}

问题是当调用this.processMessage()时出现错误:

ERROR TypeError: this.processMessage is not a function

我知道这是一个范围问题,因为'这个'现在是窗口。处理这种情况的最佳方法是什么?

 let that = this 
在es6之外可以接受listen()吗?

1 个答案:

答案 0 :(得分:2)

您不必手动创建中间变量,TypeScript会在您使用箭头功能时为您执行此操作:

listen(messageEvent, (e) => {
  if (e.origin == 'someURL') {
    console.log(e.data)
    this.doStuff(e.data);
  }
}, false);

在后台,通过在编译到不支持箭头功能的目标时创建名为_this的变量,它完全相同。