Angular 8 和 9 中提供和注入“Window”与 Window 之间有什么区别

作者:编程家 分类: angular 时间:2025-05-06

### Angular 8 和 9 中提供和注入“Window”与 Window 的区别

在 Angular 8 和 9 中,有一些微妙的区别涉及到如何提供和注入`Window`对象。`Window`对象代表了浏览器的窗口,包含了浏览器窗口的所有信息和功能。在 Angular 中,如果需要在组件或服务中使用`Window`对象,有两种常见的方式:通过直接使用或者通过依赖注入来获取。

#### 提供和注入 Window 对象的方法

#### 1. 直接使用 Window 对象:

在某些情况下,你可能需要直接使用全局的`window`对象。在 TypeScript 或 JavaScript 中,直接引用`window`对象是合法的。例如:

typescript

// 在组件中直接使用 window 对象

export class YourComponent {

constructor() {

// 访问 window 对象的属性和方法

window.scrollTo(0, 0);

const windowWidth = window.innerWidth;

console.log('窗口宽度:', windowWidth);

}

}

但是,在 Angular 中,直接使用全局的`window`对象并不是最佳实践,因为它可能会导致一些问题,特别是在服务器端渲染或单元测试时。

#### 2. 通过依赖注入获取 Window 对象:

在 Angular 中,更推荐的方式是通过依赖注入来获取`Window`对象。通过将`Window`对象注入到服务或组件中,可以更好地进行模拟和测试,并且不会直接依赖于全局对象。在提供和注入`Window`对象时,有所不同的方式取决于 Angular 的版本。

##### Angular 8:

在 Angular 8 中,可以使用`InjectionToken`来提供和注入`Window`对象。首先,在`app.module.ts`文件中创建一个`InjectionToken`并将`Window`对象注入到提供商中:

typescript

import { InjectionToken } from '@angular/core';

export const WINDOW = new InjectionToken('Window', {

providedIn: 'root',

factory: () => window

});

然后,在服务或组件中注入`Window`对象:

typescript

import { Inject } from '@angular/core';

import { WINDOW } from './app.module';

export class YourService {

constructor(@Inject(WINDOW) private window: Window) {

// 使用注入的 window 对象

const windowWidth = this.window.innerWidth;

console.log('窗口宽度:', windowWidth);

}

}

##### Angular 9 及更新版本:

在 Angular 9 及更新版本中,可以直接使用`window`作为提供者,不再需要使用`InjectionToken`。提供和注入`Window`对象的方式变得更加简单:

typescript

import { Injectable } from '@angular/core';

@Injectable({

providedIn: 'root'

})

export class YourService {

constructor(private window: Window) {

// 使用注入的 window 对象

const windowWidth = this.window.innerWidth;

console.log('窗口宽度:', windowWidth);

}

}

###

无论是直接使用还是通过依赖注入获取`Window`对象,都可以在 Angular 应用中访问浏览器窗口的属性和方法。但是,更推荐使用依赖注入的方式,因为它更利于测试和模拟,并且不会直接依赖于全局对象。

在 Angular 8 中,使用`InjectionToken`来提供和注入`Window`对象,而在 Angular 9 及更新版本中,直接使用`window`作为提供者更为简洁方便。选择适合你项目版本的方法,并根据最佳实践来获取和使用`Window`对象。