Angular 从窗口中取出值event.data.addEventListener(MessageEvent)以执行新函数

Angular 从窗口中取出值event.data.addEventListener(MessageEvent)以执行新函数,angular,typescript,Angular,Typescript,我正在使用angular,我想创建一个linkedin登录API。为此,我将使用window.open打开一个新窗口,以允许用户接受或不接受,并且当我从Linkedin登录成功接受返回URI时,我将使用window.addEventListener-event.data.返回一个代码,返回到使用window.opener.postMessage的父窗口。问题是我现在不知道如何从addeventlistener函数中取出这个值,用这个值触发另一个函数 在我们将接受或不接受linkedin登录自动化

我正在使用angular,我想创建一个linkedin登录API。为此,我将使用window.open打开一个新窗口,以允许用户接受或不接受,并且当我从Linkedin登录成功接受返回URI时,我将使用window.addEventListener-event.data.返回一个代码,返回到使用window.opener.postMessage的父窗口。问题是我现在不知道如何从addeventlistener函数中取出这个值,用这个值触发另一个函数

在我们将接受或不接受linkedin登录自动化的弹出窗口中启动的组件

从'@angular/core'导入{Component,OnInit};
从“../../services/auth.service”导入{AuthService}”;
从“@angular/router”导入{ActivatedRoute}”;
@组成部分({
选择器:“应用程序登录”,
templateUrl:'./sign-in.component.html',
样式URL:['./登录.component.scss']
})
导出类SignInComponent实现OnInit{
私有代码:字符串;
私有国家:字符串;
建造师(
公共授权:授权服务,
公共路线:激活的路线
) { }
//初始化时,我们获取参数并将消息发送给父级的addeventlistener
恩戈尼尼特(){
//获取uri linkedin指定URL的参数
this.code=this.route.snapshot.queryParamMap.get(“代码”);
this.state=this.route.snapshot.queryParamMap.get(“state”);
if(this.code!==null){
const params=window.location.search;
if(窗口开启器){
//如果参数存在,则将代码发送到父窗口
if(this.state==this.auth.state)
//把它们送到开瓶器窗口
{
window.opener.postMessage(this.code);
}//如果结束
}//如果结束
}else if(窗口开启器){
window.opener.postMessage('autorisizationannue');
}
window.close();
}//结束奥尼特
}//末级
执行window.open代码以将值从子窗口返回到父窗口的服务


从“@angular/core”导入{Injectable};
从'@angular/Router'导入{Router};
从'@angular/common/http'导入{HttpClient};
//接口利用器
从“./User.model”导入{User};
从'firebase/app'导入{auth};
从'@angular/fire/auth'导入{AngularFireAuth};
从'@angular/fire/firestore'导入{AngularFirestore,AngularFirestoreDocument};
从“rxjs”导入{可观察的,of,interval,Subscription};
从“rxjs/operators”导入{switchMap,take};
@可注射({providedIn:'root'})
导出类身份验证服务{
//性质--------------
用户$:可观察;
状态:字符串=“”;
clientID:String='';
keyID:String='';
urlinkedin=`https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id=${this.clientID}&redirect\u uri=http://localhost:4200/authentification/sign-in&scope=r_liteprofile%20r_电子邮件地址%20w_成员_社会和州=${this.state}`;
windowAttributes:string=“工具栏=是,滚动条=是,可调整大小=是,顶部=500,左侧=500,宽度=520,高度=700”;
windowTarget:string=“\u blank”;
codeRecup:字符串;
//端部特性--------------
//建设者
建造师(
私人afAuth:AngularFireAuth,
私人afs:AngularFirestore,
专用路由器:路由器,
私有http:HttpClient
) {
//方法-------------------------------
//Linkedin------------------
linkedinSignin(){
open(this.urlinkedin、this.windowTarget、this.windowAttributes);
window.addEventListener('message',函数(事件){
如果(event.origin!==”http://localhost:4200")
返回;
console.log(事件数据);
},假);
}
我想获取event.data并在window.addEventListener之后执行的其他函数中使用它


linkedinGetToken(){
//我需要获取一个新函数的event.data,该函数将在addeventlistener之后触发
this.coderecurip=event.data;
}
//结束Linkedin----------------------

多亏了StackOverflow上的这篇文章,我找到了答案: 答案是在addeventlistener之外执行函数(避免匿名函数)


//Linkedin------------------
linkedinSignin(){
open(this.urlinkedin、this.windowTarget、this.windowAttributes);
window.addEventListener('message',this.linkedinGetToken,false);
}
linkedinGetToken(事件){
如果(event.origin!==”http://localhost:4200")
返回;
console.log(事件数据);
}
//结束Linkedin----------------------

多亏了StackOverflow上的这篇文章,我找到了答案: 答案是在addeventlistener之外执行函数(避免匿名函数)


//Linkedin------------------
linkedinSignin(){
open(this.urlinkedin、this.windowTarget、this.windowAttributes);
window.addEventListener('message',this.linkedinGetToken,false);
}
linkedinGetToken(事件){
如果(event.origin!==”http://localhost:4200")
返回;
console.log(事件数据);
}
//结束Linkedin----------------------