在Angular 5.2.10中如何在结构指令中获取宿主MatFormField实例
解决Angular指令中获取宿主MatFormField实例的问题
嘿,我来帮你搞定这个问题!你遇到的情况是因为Angular依赖注入的默认查找策略导致的——直接注入MatFormField时,Angular会默认跳过当前元素,去父级容器里找实例,但你的指令是直接挂在MatFormField本身上的,所以得调整注入的方式。
只需要给构造函数里的MatFormField参数加上@Self()装饰器就行,它会告诉Angular从当前指令的宿主元素(也就是那个mat-form-field)本身获取实例。修改后的代码如下:
import { Directive, Self } from '@angular/core'; import { MatFormField } from '@angular/material/form-field'; @Directive({ selector: "[appEntityValidate]" }) export class EntityValidateDirective { constructor( @Self() private readonly matFormField: MatFormField ) { // 现在可以正常访问MatFormField实例了 console.log('获取到的MatFormField:', this.matFormField); } }
简单解释下:在Angular 5中,DI的默认查找逻辑是跳过当前元素(@SkipSelf())并在宿主的父级中查找,而@Self()装饰器会改变这个行为,让DI优先从当前元素(也就是指令挂载的那个mat-form-field)上获取对应的实例,这样就能精准拿到你需要的MatFormField对象了。
如果遇到特殊情况@Self()不生效,你也可以试试@Host()装饰器,它会在宿主元素及其父级中查找,但在你的场景里@Self()是最贴合需求的。
内容的提问来源于stack exchange,提问作者Alexander Abakumov
相关产品推荐
相关产品推荐

