javascript - 在 ES2015 中使用 Angular 中的 DOCUMENT 服务

标签 javascript angular dependency-injection ecmascript-6

我有一个用 ES2015 编写的简单 Angular 应用程序,不是 TypeScript。

在 AngularJS 1.x 中,我们可以注入(inject) $document 以避免使用 document 浏览器全局。

我们如何在 Angular 中做同样的事情(这些文档都是针对 TypeScript 的,令人惊讶的是,没有一个文档似乎显示了这一基本要求)。

我的 main.js 入口文件(我也使用 Webpack 2.2)是这样的:

'use strict';

import 'reflect-metadata';
import 'zone.js';

import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {AppModule} from './app/app.module';

let boot = document.addEventListener('DOMContentLoaded', () => {
    platformBrowserDynamic().bootstrapModule(AppModule);
});

export { boot };

目前这是可行的,但它使用全局 document 来添加 DOMContentLoaded 事件处理程序。

如何在 Angular 中为 document 注入(inject)某种 Angular 包装器?

据官方docs DOCUMENT 是一个“可注入(inject) token ”,但我看不到任何使用它的示例。而且我真的没有任何东西可以将其注入(inject)

我尝试像这样导入它:

import {DOCUMENT} from '@angular/platform-browser';

但现在 DOCUMENT 只是一个具有 desc 属性的对象?

最佳答案

document 在应用程序引导之前使用。 上面的代码不能从 DOCUMENT 提供程序中受益(也不应该,它会在这里引入不必要的抽象)。

DOCUMENT 应该用作 Angular 应用程序内 DOM 操作的抽象:

class SomeComponent {
  constructor(@Inject(DOCUMENT) private document) {
  }
  ngOnInit() {
    this.document.querySelector(...)...
  }
}

它等于浏览器中的window.document,但可以通过DI进行模拟,这在测试或服务器端应用程序中很有用(后者使用来自@angular/platform的crippled implementation -server 默认情况下)。

关于javascript - 在 ES2015 中使用 Angular 中的 DOCUMENT 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43870076/

相关文章:

Angular Material 自定义 MatFormFieldControl - 如何管理错误状态

c# - 一个服务,两个实例,如何使用 ASP.NET Core DI 进行配置?

c# - 在 ASP.NET Core 依赖注入(inject)中覆盖生命周期

javascript - JSON 请求包含在另一个 JSON 中?

javascript - Object.seal(Object.prototype) 是否使所有对象不可变?

javascript - 在 Angular 2 中绑定(bind) ngmodel 中的 json 值

版本 10 上的 Angular Material 日期选择器(日期范围功能)

javascript - 从 Javascript 设置 ng-model 名称

javascript - html div 重叠在具有较高 z-index 的图像上时不会获得鼠标点击

java - Guice 构造函数注入(inject) String 依赖项(或其他未绑定(bind)的原语)?