最近公司的EIP专案有个需求。主管在签核一览表里会点击要签核的单子另开一个视窗,需求单位希望主管签完的当下马上自动更新一览表里的签核状态。
最简单的解法就是重整页面(window.load),此时因为重打API就会得到更新後的签核状态。或是也可以直接用Angular的output去触发更新状态(我们公司的前端框架是用Angular)。但在这里除了要保留是一览表里的页数、搜寻条件等等,而且要签核的单子来自於不同的网域。因此,在这个机缘就认识了postMessage好朋友啦~
需要跨网域传值时使用
父视窗:
子视窗:
// 父视窗- list.ts
export class ListComponent implements OnInit, AfterViewInit {
// 打开表单
openSheet(link: string) {
window.open(link, '_blank');
}
// 接收到讯息後的动作- 写在全域变数
@HostListener('window:message', ['$event'])
onMessage(event: MessageEvent): void {
console.log('成功触发:查看event.data值:', event.data);
if (event.data === 'reload') {
console.log('通过判断,准备重刷表单资料getRowData()');
this.getData();
};
};
}
// 子视窗- ApprovePage.ts
export class ApprovePageComponent implements OnInit {
opener;
// 呼叫抽单API
callAbortAPI(type: string) {
this._ForgetDutyService.cancelApply(this.abortPara).subscribe(res => {
if (res.status === "打API成功") {
console.log(this.opener); // 检查opener真的有值
if (this.opener) {
window.opener.postMessage('reload', '*'); // 更新一览表
};
};
});
}
}
window.open()
的方式打开子视窗的页面,不然 postMessage is undefined
的错误讯息 window.opener.postMessage({data:'reload',status:'success'}, '*'); // 通知父视窗(更新一览表)
在纯JS使用=>
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage
https://xyz.cinc.biz/2014/05/html5-postmessage-text.html
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/137962/
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage
在Angular使用=>
https://www.tpisoftware.com/tpu/articleDetails/2077
hi~我们今天要讨论有关solidity合约内容,今天的内容会延续昨天的!所以如果还没看昨天的建议...
了解盒模型後,就要为标签套上各种花样了,上一篇介绍了简单的套用方法,但这个套用方法其实不太好用! ...
Sveiki,我是Charlie! 在Day18我们讲到了结帐的前端,而今天我们将进入Paypal金...
4GL语言首见於1986年,INFORMIX在数据库产品中提供INFORMIX-4GL 1.0语言...
今日文章目录 前言 参考资料 前言 在 Day25-[React] props 中我们练习用pro...