Угловой документ и окно undefined
Я использую точечное ядро с angular 4 и конфигурацией webpack.
Когда я пытаюсь получить окно или документ в компоненте или службе, я получаю эту ошибку:
ReferenceError: документ не определен
ReferenceError: окно не определено
Вот ошибки, которые я получаю:
Microsoft.AspNetCore.NodeServices[0]
ERROR { ReferenceError: window is not defined
at _window (C:\gitRepose\AngularCore\FM\FMWebApp\FootballWebApp\ClientApp\dist\main-server.js:30801:12)
Ответы
Ответ 1
Если вы используете рендеринг на стороне сервера, вы должны удалить весь код с помощью window
или document
, который выполняется в node, потому что node не имеет этих переменных (node имеет только global
).
Если вы все еще хотите использовать window
или document
в node env, вы можете попробовать использовать jsdom (https://github.com/tmpvar/jsdom).
Ответ 2
Если вы хотите быстро исправить:
поместите этот код в начало вашего файла typescript:
declare var window;
declare var document;
Но если вы хотите сделать это правильно:
import { DOCUMENT } from '@angular/platform-browser';
export const WINDOW = new InjectionToken( 'WINDOW' );
@Component()
export class YourComponent{
constructor(
@Inject( WINDOW ) private window,
@Inject( DOCUMENT ) private document){}
внутри вашего модуля:
providers : [
{
provide : WINDOW,
useValue : window
}
],
Таким образом вы можете переопределить окно и документ в своих тестах и где-нибудь еще.
Ответ 3
Ну, я использую приложение angular 4 и вставляю объект окна, используя:
В компоненте constructor( @Inject('Window') private window: Window) { }
и в модуле: providers: [{ provide: 'Window', useValue: window }]
а затем в компонентной функции я он использовал: this.window
Ответ 4
На стороне сервера JavaScript работает в Node среде, которая не имеет окна или объекта документа. Объект Window и Document работает, когда ваш javascript-код выполняется в среде браузера. Поэтому убедитесь, что код на стороне окна или документа не выполняется на стороне сервера.
Вы можете использовать node-jsdom (https://www.npmjs.com/package/node-jsdom), если вам действительно нужно использовать объект window или document. Просто установите
$ npm install node-jsdom
Здесь (https://github.com/darrylwest/node-jsdom) вы получит помощь по node -jsdom
Ответ 5
оберните свой код, который зависит от окна, как показано ниже
if (typeof window !== 'undefined') {
// your client-only logic here like below
alert(window.innerWidth);
}
Ответ 6
Если вы хотите использовать AOT, используйте инъекцию зависимостей для монтирования окна в свои компоненты. Короче говоря, напишите службу, которая может предоставить объект окна:
import { Injectable } from '@angular/core';
function getWindow (): any {
return window;
}
@Injectable()
export class WindowRefService {
get nativeWindow (): any {
return getWindow();
}
}
Подробнее здесь.
Ответ 7
Поместите свое окно. связанный код внутри функции компонентаDidMount.