angular - 如何使用角度指令在按下转义键时破坏主机组件?
问题描述
以下是我在按下退出时销毁弹出窗口的实现。
@Directive({
selector: '[escapeHostDestroy]',
})
export class DestroyPopUpOnEscapeDirective {
constructor(
private renderer: Renderer2,
private el: ElementRef,
private viewContainerRef: ViewContainerRef
) {}
@HostListener('document:keydown.escape', ['$event']) destroyHost(ev: KeyboardEvent) {
this.renderer.destroy();
}
}
但似乎它不起作用。
我可以使用渲染器(设置样式)隐藏/显示此弹出窗口。但我不想那样。相反,我想销毁指令所在的主机组件。
我怎样才能做到这一点?
& 还有一个疑问,我如何访问指令中的组件方法(这样我就可以从指令本身触发事件......就像将组件注入到指令中)
//main component.html
<app-popup *ngIf="showPopup"></app-popup>
// popup component.html
<div escapeHostDestroy>
... {%rest of popup contents here%}
</div>
解决方案
鉴于您的评论和用例,以下内容可能会有所帮助:
https://stackblitz.com/github/ClientsideDesign/ngx-dialog-injection-starter-pack
这是一个可重用的材质对话框的实现,带有一个注入的子组件(它有一个表单)以及父子组件之间的通信。根据@poul的回答,设置服务以在应关闭对话框时进行通信是关键。
dialog-wrapper
是一个对话框组件dialog-form
是注入动态组件的示例dialog-wrapper
,具有必要的支持服务。name
(Alice) 是任意数据从父组件传递到dialog-form
viadialog-wrapper
- 当提交表单时,带有
name
and的对象favouriteFood
会被传递回父级。dialog-form
这也会触发父组件关闭dialog-wrapper
。
我试图使代码尽可能简单,以便可以轻松地重新分配任务。对话框包装器本身相当简单;大部分繁重的工作都在注入的组件和父组件中。
根据您的原始帖子,当您按下 时,对话框关闭并且子组件被销毁escape
。
完整的代码可以在https://github.com/ClientsideDesign/ngx-dialog-injection-starter-pack上查看。
推荐阅读
- amazon-web-services - CodePipeline 可以使用特定的提交吗
- swift - 从自身打开新的 ViewController
- java - FileWriting 后 Files.readAllLine() 不起作用
- wordpress - 使用 WooCommerce。如何在购物车/结帐前根据地址(即邮政编码)提示输入地址,显示可用的特定产品?
- csv - 使用 awk 拆分 csv 文件并按列重新格式化保存到新文件
- reactjs - 使用react-three-fiber加载网格(OBJ + MTL + JPG),纹理不起作用
- java - java.sql.SQLSyntaxErrorException:'ID' 不是表中的列或 VTI 'AUTHORBOOKDB.AUTHOR'
- vue.js - 如何在 VueJS 中美化 url
- python - 将空格字符串拆分为列表,但不拆分引号中的空格,并且还允许在 Python 中的引号中包含特殊字符(如 $、% 等)
- python-3.x - 如何使用 asyncio 运行更多事件