- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在 Angular 2 中使用节点和 express api 后端开发电子商务应用程序。我目前正在使用 passport-facebook 和 jwt 进行身份验证的社交登录部分。我的代码关注点围绕着 Angular 2 部分。当用户点击 login/register with facebook 按钮时,它会打开一个新选项卡,开始 facebook 登录流程。然后该窗口将通过 window.postMessage 将 jwt 返回给开启器。然后打开器向窗口发送一条成功消息,打开的窗口将关闭。一切正常,但不是很干净,即我不得不破解它才能正常工作。理想情况下,我会调用我的授权服务来处理 facebook 登录,而不是处理组件中的所有内容,而是在 window.postMessage 的事件处理程序中处理。postMessage 'this' 不再引用该组件,它引用 window 对象,因此我无法调用通过“这个”服务。我无法弄清楚如何获取对该组件的引用,以便我可以调用该服务。有人有什么建议吗?
下面是我的 typescript 登录组件。如果需要,我可以包含其他代码,但我不知道是否需要它。
import { Component, OnInit, AfterViewChecked } from '@angular/core';
import { AuthService } from './auth.service';
import { Router } from '@angular/router';
import { ILoginUser } from './loginUser.model';
@Component({
moduleId: module.id,
templateUrl: 'login.component.html',
styleUrls: ['login.component.css']
})
export class LoginComponent implements OnInit {
constructor(private _authService: AuthService, private _router: Router) {
if (window.addEventListener) {
window.addEventListener("message", this.receiveMessage, false);
} else {
(<any>window).attachEvent("onmessage", this.receiveMessage);
}
}
ngOnInit() { }
user: ILoginUser = {
username: "",
password: ""
}
error: boolean = false;
success: boolean = false;
errorMessage: string = "";
redirect: boolean = false;
login() {
this._authService.login(this.user).subscribe(data => {
console.log (data);
if (data.success){
this._router.navigate(['/product']);
} else {
this.error = true,
this.errorMessage = data.message
}
}, errorMsg => {
this.error = true;
this.errorMessage = errorMsg;
});
}
receiveMessage(event: any)
{
if (event.origin !== "http://localhost:3000")
return;
localStorage.setItem("token", event.data.token);
localStorage.setItem("username", event.data.username);
(<any>window).popup.postMessage("success", "http://localhost:3000");
}
ngAfterViewChecked() {
//since we can't call the authservice directly we check to see if a redirect flag is set to true
if (this.redirect) {
this._router.navigate(['/product']);
}
}
authFacebook() {
(<any>window).popup = window.open('http://localhost:3000/api/auth/facebook');
//set the redirect flag to true so when angular checks again we can redirect to the products page
this.redirect = true;
}
}
最佳答案
您还可以使用@HostListener() 函数装饰器:
@HostListener('window:message', ['$event'])
onMessage(event) {
this.receiveMessage(event);
}
关于 Angular 2 window.postmessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41444343/
我正在掌握 Chrome 自定义选项卡中可用的功能,我很想知道如何在自定义选项卡和应用程序本身之间进行通信。我可以在 CustomTabsSession 中看到有类似 requestPostMessa
我正在创建 Cypress e2e 测试,但是我们的应用程序作为父页面顶部的模态 (iframe) 打开。由于 Cypress 不支持 iframe,我决定尝试“独立”运行应用程序。但是,在启动应用程
显然,使用 window.postMessage是 preferred way在所有现代浏览器中通过 window.setTimeout(fn, 0) 对异步 javascript 回调进行排队。我找
我有 2 个应用程序,一个是隐藏窗口(“hW”),另一个是控制台应用程序(“CA”),来自我想向硬件发送命令。在控制台应用程序中,我得到了硬件句柄,这是一个问题:如果我正在运行: PostMessag
所以我在 Html5 Demos 上摆弄 Html5 PostMessage 示例我创建了一个示例 jsfiddle看看我是否理解它是如何协同工作的。 该演示使用了 document.getEleme
我有一个包含 iFrame 的基本 HTML 页面。当父级加载并且 iFrame 在其中时,iFrame 执行以下 javascript: myParent = window.top; if (win
我有以下脚本 父页面(pair_pixel_filter.php): window.addEventListener("message", function(e) { $('
我遇到的问题是,在注册服务 worker 后,navigator.serviceWorker.controller 始终为 null。 我想使用 postMessage 向 service worke
我正在使用 window.postMessage 函数与 Angular Controller 通信 iframe https://developer.mozilla.org/en-US/docs/W
我在关注 this本地消息传递指南,但现在我陷入了停滞。 Firefox 上的开发者控制台不断给我同样的错误: “尝试在断开连接的端口上发布消息”以及之前的“Webconsole 上下文已更改”。 我
有一个问题我无法解决。我在 Delphi 中创建了两个服务应用程序并尝试在其中发布消息。当然,此类应用程序中没有窗口,PostMessage 需要一个窗口句柄参数来发送消息。 因此,我使用 Alloc
到目前为止,我只看到过关于 postmessage 的教程,其中一个窗口发送一种消息,而另一个窗口仅以一种方式解释消息。 如果我想在窗口之间进行许多不同类型的交互怎么办,postmessage 可以处
我有一个带有视频 API 的 HTML 5 简单表单,我想在用户单击提交按钮时播放视频 这里是演示 HTML 表单输入。 HTML 5
我不知道该怎么办。我尝试了来自不同来源的几个示例代码,我在不同的浏览器(从 Chrome 9 到 FF 4)中尝试了它们,但似乎仍然没有任何东西可以与“postMessage”功能一起使用。JS 控制
我正在尝试将消息从父窗口发布到它打开的子窗口。然而,该消息并未被发布。 在父窗口脚本中: function editAnnotation(annotKey){ var annotString
我正在使用 var handle = window.open(url, name, options) 创建一个弹出窗口。该窗口包含许多允许用户导航的链接。用户完成导航后,可以单击按钮来表示已完成。当用
我有一个包含表单的 iframe,在该 iframe 中我有以下内容: // Send a message to the parent window window.parent.postMessag
我正在尝试将消息从父窗口发布到它打开的子窗口。然而,该消息并未被发布。 在父窗口脚本中: function editAnnotation(annotKey){ var annotString
我正在尝试使用 Ben Almans jquery postmessage调整 iFrame 的大小。我或多或少地将他的示例与不同的服务器和动态内容一起使用。 我也在该网站上发布了一个问题,但这可能是
我正在尝试使用实验性 Canvas 功能 - offscreenCanvas。 index.html const canvas = document.queryS
我是一名优秀的程序员,十分优秀!