【问题标题】:Can I force an Angular #variableName for an HTML element to return an ElementRef?我可以强制 HTML 元素的 Angular #variableName 返回 ElementRef 吗?
【发布时间】:2021-10-11 16:05:32
【问题描述】:

如果我创建一个这样的按钮:

<button #myButton>My Button</button>

...并像这样使用ViewChild

@ViewChild('myButton', { static: true }) createButton: ElementRef;

...那么createButton 是(如声明的)ElementRef,其中createButton.nativeElement 是一个 DOM 元素。

但是,如果我这样做:

<button mat-raised-button #myButton>My Button</button>

...我的变量不再是 ElementRef,而是 MatButton 实例。

我真的希望变量保持为ElementRef。我该怎么做?

我见过像&lt;form #myForm="ngForm"... 这样的符号,它确保变量是NgForm,或者&lt;input #firstName="ngModel"...&gt; 得到NgModel

我尝试了&lt;button #myButton="elementRef" mat-raised-button...,以及该主题的一些不同变体,但它们都产生了编译错误。有没有类似的东西可以解决问题?

这是 Angular 的一个非常缺乏文档记录的方面。我什至找不到这些参考/变量的正确术语。哈希参考?哈希变量?赫伯特?我知道#firstName="ngModel" 之类的唯一原因是通过查看示例,而不是通过说明一般概念的文档。

【问题讨论】:

    标签: javascript html angular typescript angular-material


    【解决方案1】:

    要指定要查询的令牌,可以使用 ViewChild#read 参数,如 Angular 文档中所述:

    read - 用于从查询的元素中读取不同的标记。

    示例

    @ViewChild('myButton', { read: ElementRef, static: true }) createButton: ElementRef;
    

    Check the demo


    这是 Angular 的一个非常缺乏文档记录的方面。我什至找不到这些参考/变量的正确术语。哈希 参考?哈希变量?赫伯特?我知道的唯一原因 #firstName="ngModel" 之类的内容来自查看示例,而不是来自 阐明一般概念的文档。

    关于这个,有一个专门的部分,你可以查看here

    【讨论】:

    • 谢谢!我想如果我知道将其称为“模板变量”,我会更快找到文档。遗憾的是,HTML 中似乎没有办法执行 read 所做的事情,以防您想在 HTML 本身中将变量引用为 ElementRef。
    • 真的,@kshetline。在这种情况下,Ingo Bürk 的回答显示了一种干净的方法:)
    【解决方案2】:

    鉴于问题,@developer033 的回答是正确的。但是,当想要直接在模板中使用模板引用变量而不是通过@ViewChild 时,可能会提出相同的问题。为了完整起见,我将在此处提供答案。

    简短的回答:不,你不能。但是我们可以通过编写我们自己的指令作为代理来使其工作:

    @Directive({
      selector: "[injectRef]",
      exportAs: "elementRef",
    })
    export class InjectRefDirective extends ElementRef<unknown> {
      constructor(elementRef: ElementRef<unknown>) {
        super(elementRef.nativeElement);
      }
    }
    

    然后用 as

    <button injectRef #myRef="elementRef"></button>
    

    【讨论】:

    • 很酷的把戏。也许你应该为 Angular 代码库做一个 PR 来添加这个。
    猜你喜欢
    • 2018-05-08
    • 2015-01-25
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多