#angular #typescript #dom #angular-universal #angular11
Вопрос:
Я пытаюсь использовать свойство документа DOM для удаления и добавления классов в html и управления некоторыми свойствами CSS, но при выполнении ng run app:serve-ssr
команды возникает следующая проблема:
Это мой код, это услуга, которая находится в поставщике под названием app-initializer, это поставщик, и именно так он импортируется в AppModule.
@Injectable({
providedIn: 'root',
})
export class ThemeService {
constructor(@Inject(DOCUMENT) private document: Document) {}
private loadCss(href: string, id: string): Promise<Event> {
return new Promise((resolve, reject) => {
const style = this.document.createElement('link');
style.rel = 'stylesheet';
style.href = href;
style.id = id;
style.onload = resolve;
style.onerror = reject;
this.document.head.append(style);
});
}
}
Поставщик приложений
import { APP_INITIALIZER } from '@angular/core';
import { ThemeService } from './utils/services';
export const AppInitializerProvider = {
provide: APP_INITIALIZER,
useFactory: (themeService: ThemeService) => () => {
return themeService.loadTheme();
},
deps: [ThemeService],
multi: true,
};
Модуль приложения
// ....
providers: [AppInitializerProvider]
// ....
Версия приложения:
- Угловой интерфейс командной строки: 11.2.7
- Узел: 14.16.0
- Угловой: 11.2.8
- Тестирование в Google Chrome и Microsoft Edge
Комментарии:
1.
@Inject(DOCUMENT) private document: Document
По какой-то причине (не спрашивайте меня)document
должно быть типаany
, так что@Inject(DOCUMENT) private document: any
Ответ №1:
Попробуйте использовать appendChild
вместо этого, append
возможно, не поддерживается на стороне сервера DOM
this.document.head.appendChild(style);
Вы также можете использовать Renderer2
, что рекомендуется при работе с элементами DOM из углового
this.renderer.appendChild(this.document.head, style);