You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:26:31