Невозможно захватить nativeElement для пользовательских компонентов angular

Я не могу получить ссылку на 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())

Вопрос в том, как получить доступ к собственному элементу пользовательского компонента, если я хочу внести изменения в атрибуты тега. Во-вторых, каким бы способом я к ним ни обращался, если я вручную изменю атрибуты для пользовательского компонента, будет ли он обнаружен как изменение также после изменения?


person Gary    schedule 13.07.2017    source источник
comment
Если я изменю атрибуты вручную - что именно вы измените и что вы хотите, чтобы фреймворк подобрал?   -  person Max Koretskyi    schedule 13.07.2017
comment
См. stackoverflow.com/questions/39908967/ и stackoverflow.com/questions/45064576/   -  person yurzui    schedule 13.07.2017
comment
what exactly do you change. 1) Если я получу доступ к объектам экземпляра класса компонента, скажем, переменная внутри него будет обнаружена автоматически? 2) Если я получу ссылку на элемент cmp <my-feature-cmp>, могу ли я сделать это, если что-то сломаю? this.el.first.nativeElement.someatrribute = 'somevalue' или this.el.first.nativeElement.style.color = '#ccc' или добавлять прослушиватели событий (somecustomevent) на лету?   -  person Gary    schedule 13.07.2017


Ответы (1)


Вопрос в том, как получить доступ к собственному элементу пользовательского компонента.

Вы должны использовать read опцию:

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

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

Также см. этот ответ, чтобы узнать, что мы можем получить с помощью read.

Если я вручную изменю атрибуты для пользовательского компонента, будет ли он обнаружен как изменение после изменения?

Нет, Angular не обрабатывает изменения в элементах DOM. Для получения дополнительной информации о процессах обнаружения изменений см. Все, что вам нужно знать об обнаружении изменений в Angular.

person Max Koretskyi    schedule 13.07.2017
comment
получил это работает. Итак, если я получу доступ к N-му элементу, мне придется сделать .toArray () и правильно получить этот конкретный элемент? - person Gary; 13.07.2017
comment
Окей круто. what exactly do you change. 1) Если я получу доступ к объектам экземпляра класса компонента, скажем, переменная внутри него будет обнаружена автоматически? 2) Если я получу ссылку на элемент cmp <my-feature-cmp>, могу ли я сделать это, если что-то сломаю? this.el.first.nativeElement.someatrribute = 'somevalue' или this.el.first.nativeElement.style.color = '#ccc' или добавить такие прослушиватели событий (somecustomevent) на лету? - person Gary; 13.07.2017
comment
Я помню, что мы долго обсуждали здесь, все еще неясно, что делает компакт-диск? Если вы измените свойство экземпляра компонента и оно используется в шаблоне, да, Angular примет это изменение. Если вы измените DOM через собственный элемент, нет, изменения не будут обнаружены. - person Max Koretskyi; 13.07.2017