无法为自定义角度组件捕获 nativeElement

Posted

技术标签:

【中文标题】无法为自定义角度组件捕获 nativeElement【英文标题】:Unable to capture nativeElement for custom angular components 【发布时间】:2017-12-17 16:59:31 【问题描述】:

我无法获取自定义元素的 nativeElement 的引用。我有一个这样的模板:

<div #testone>
<my-feature-cmp><my-feature-cmp>
<my-feature-cmp><my-feature-cmp>
<my-feature-cmp><my-feature-cmp>
<div>

用于访问的代码: @ViewChild('testone') el: ElementRef;

当我这样做时,我得到了元素引用 -> console.log(this.el.nativeElement)

第二种模板

<my-feature-cmp></my-feature-cmp>
<my-feature-cmp></my-feature-cmp>
<my-feature-cmp></my-feature-cmp>

用于访问的代码:

@ViewChildren(MyFeatureCmp) el: MyFeatureCmp;

执行此操作时出现本机元素错误 ->

console.log(this.el.nativeElement)

当我这样做时,我得到了类引用并且没有 nativeElement ->

console.log(this.el)
console.log(this.el.toArray())

问题是如果我想更改标签属性,如何访问自定义组件的本机元素。其次,无论我以何种方式访问​​它们,如果我手动更改自定义组件的属性,它是否会在更改后也被检测为更改?

【问题讨论】:

如果我手动更改属性 - 你到底改变了什么,你希望框架选择什么? 见***.com/questions/39908967/…和***.com/questions/45064576/… what exactly do you change。 1)如果我访问组件类实例的对象说其中的变量会自动检测到变化吗? 2)如果我得到&lt;my-feature-cmp&gt; 的 cmp 元素引用,那么我可以在某处破坏某些东西的情况下做到这一点吗? this.el.first.nativeElement.someatrribute = 'somevalue'this.el.first.nativeElement.style.color = '#ccc' 或添加事件侦听器 (somecustomevent) 即时? 【参考方案1】:

问题是如何访问自定义组件的原生元素

你必须使用read 选项:

@ViewChildren(MyFeatureCmp, read: ElementRef) el: QueryList<ElementRef>;

console.log(this.el.first.nativeElement)

另请参阅this answer,了解使用read 可以获得什么。

如果我手动更改自定义组件的属性,它会得到 更改后也检测为更改?

不,Angular 不会处理对 DOM 元素的更改。有关更改检测过程的更多信息,请参阅Everything you need to know about change detection in Angular。

【讨论】:

让它工作。因此,如果我要访问第 N 个元素,我将不得不执行 .toArray() 并正确获取该特定元素? 好酷。 what exactly do you change。 1)如果我访问组件类实例的对象说其中的变量会自动检测到变化吗? 2)如果我得到&lt;my-feature-cmp&gt; 的 cmp 元素引用,那么我可以在某处破坏某些东西吗? this.el.first.nativeElement.someatrribute = 'somevalue'this.el.first.nativeElement.style.color = '#ccc' 或添加类似 (somecustomevent) 这样的事件监听器? 我记得我们讨论了很久here,现在还不清楚CD 是做什么的吗?如果您更改组件实例属性并且它在模板中使用,是的,Angular 会接受更改。如果你通过原生元素修改 DOM,不会,不会检测到变化。

以上是关于无法为自定义角度组件捕获 nativeElement的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的类型错误:无法读取未定义的属性 XXX

无法在 Vue.JS 上捕获自定义事件

为啥单击功能会在 Angular 2 中为自定义组件触发两次

VueJS 3 + Laravel:未捕获的类型错误:无法读取未定义的属性“组件”

如何将字符串呈现为自定义 React 组件?

如何在 Angular 中为自定义组件实现伪事件?