У меня возникла проблема, когда я получаю следующую ошибку при попытке доступа к элементу html по идентификатору. Я пытаюсь получить доступ к classList, когда пользователь нажимает кнопку, чтобы применить к элементу другой класс стиля. Список классов и элемент в целом всегда имеют значение null, если только я не переключу viewEncapsulation обратно на настройку эмуляции по умолчанию.
Сообщение об ошибке:
TypeError: Cannot read property 'classList' of null
Проблема: я пытаюсь сделать так, чтобы этот конкретный компонент не наследовал сторонний файл SCSS, который я импортировал в проект через файл angular.json. Когда я использую ViewEncapsulation.Emulated по умолчанию, компонент наследует глобальные стили SCSS, которые конфликтуют со стилями некоторых компонентов.
Файловая структура нормальная, SCSS и HTML кладу в соответствующие файлы, потом импортирую в компонент.
Я чувствую, что это должно быть общей темой для более крупных проектов. Если есть другой способ переключения стилей элементов в событиях, сообщите мне об этом.
Компонент .ts:
import { Component, ViewEncapsulation, OnInit } from '@angular/core';
@Component({
encapsulation: ViewEncapsulation.Native,
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
title = 'scssTesting';
constructor() { }
step: string = 'step1';
step1: any;
step2: any;
step3: any;
ngOnInit() {
}
next() {
this.step1 = document.getElementById('step1');
this.step2 = document.getElementById('step2');
this.step3 = document.getElementById('step3');
if (this.step === 'step1') {
this.step = 'step2';
this.step1.classList.remove("is-active");
this.step1.classList.add("is-complete");
this.step2.classList.add("is-active");
} else if (this.step === 'step2') {
....
}
}
Компонент .scss
.progress {
position: relative;
display: flex;
.........
}
Компонент .html
<div class="container">
<div class="progress">
<div class="progress-track"></div>
<div id="step1" class="progress-step">
Step One
</div>
<div id="step2" class="progress-step">
Step Two
</div>
<div id="step3" class="progress-step">
Step Three
</div>
</div>
<button (click)="next()">Next Step</button>
</div>
@ViewChild()
, чтобы получитьElementRef
, как предложено @Barbu Barbu и @cgTag. Во-вторых, если вы уже используетеdocument
, просто знайте, что небезопасно использоватьdocument
непосредственно в Angular. Вы должны использовать внедрение зависимостей и@Inject(DOCUMENT)
(импортироватьInject
из'@angular/core'
иDOCUMENT
из'@angular/common'
). - person Amit Beckenstein   schedule 17.05.2019