#angular #universal
#angular #Универсальный
Вопрос:
Эта проблема возникает в Angular 7. Я обновил приложение с angular 6 до angular 7
Получение этой ошибки:
var user_id = window.localStorage.getItem('user_id');
^
ReferenceError: window is not defined
at Object../src/app/global_variable.ts (D:Projectpublicdistserver.js:208477:15)
at __webpack_require__ (D:Projectpublicdistserver.js:169701:30)
at Object../src/app/services/auth.service.ts
Комментарии:
1. @Kingslayer omit не работает, так как теперь localStorage не определен
Ответ №1:
Универсальный инструментарий отображает код на стороне сервера, а объект window доступен только в браузерах, вот почему вы получаете эту ошибку.
Вы можете добавить условие для выполнения кода на стороне клиента только в браузере с помощью isPlatformBrowser
модуля.
import { Component, OnInit, Inject, PLATFORM_ID } from '@angular/core'; // add PLATFORM_ID
import { isPlatformBrowser } from '@angular/common'; //add this
@Component({
selector: "app-root",
templateUrl: "./app.component.html"
})
export class AppComponent implements OnInit {
constructor(@Inject(PLATFORM_ID) private platformId: Object) { }
ngOnInit() {
// Client only code.
if (isPlatformBrowser(this.platformId)) {
// write your client side code here
}
}
}
Ответ №2:
«window» — это глобальный объект в Javascript, поэтому вы можете опустить его, если нет шансов на конфликт. Попробуйте использовать это,
var user_id = localStorage.getItem('user_id');
Комментарии:
1. Используя решение, которое я дал выше
2. опустить не работает, так как теперь localStorage не определен @Kingslayer
Ответ №3:
Когда вы добавляете angular universal в свое приложение, window
, document
navigator
и другие типы браузеров не существуют на сервере, поэтому их использование или любая библиотека, которая их использует (например, jQuery), не будет работать.
Если вам нужно их использовать, рассмотрите возможность ограничения их только вашим клиентом и переноса их в зависимости от ситуации. Вы можете использовать объект, введенный с использованием токена PLATFORM_ID, чтобы проверить, является ли текущая платформа браузером или сервером.
в моем проекте у меня есть следующий код внутри компонента ts file
, и он работает
import { WINDOW } from '@ng-toolkit/universal';
import { Component, Inject, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
title = 'app';
constructor(@Inject(WINDOW) public window: Window,
@Inject(PLATFORM_ID) private platformId: Object) {
}
onActivate(event) {
if (isPlatformBrowser(this.platformId)) {
this.window.scroll(0, 0); // window object used which is Instance of Window
}
}
}