Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to inject Document in service?

I have an Angular 2 application. For mocking the Document object in tests, I'd like to inject it to the service like:

import { Document } from '??'   @Injectable() export class MyService {   constructor(document: Document) {} } 

The Title service of Angular uses the internal getDOM() method.

Is there any simple way to inject the Document to the service? Also, how should I reference it in the providers array?

like image 964
RJo Avatar asked May 30 '16 08:05

RJo


People also ask

Can I use document object in angular?

You can use the DOCUMENT constant provided by the @angular/common package.


2 Answers

I'm unable to comment directly on adamdport's question (not yet 50 rep points), but here it is as stated in the angular docs.

Blockquote @GünterZöchbauer it looks like DOCUMENT is deprecated. Any idea how to do this once it's gone? For example, how would I set the favicon dynamically?

Instead of importing from platform browser like so:

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

Import it from angular common:

import {DOCUMENT} from '@angular/common'; 
like image 37
Ruud Voost Avatar answered Oct 02 '22 09:10

Ruud Voost


This has been supported by Angular for a while.

You can use the DOCUMENT constant provided by the @angular/common package.

Description of the DOCUMENT constant (taken from the API documentation):

A DI Token representing the main rendering context. In a browser, this is the DOM Document.

An example is as shown below:

my-service.service.ts:

import { Inject, Injectable } from '@angular/core'; import { DOCUMENT } from '@angular/common';  @Injectable() export class MyService {   constructor(@Inject(DOCUMENT) private document: Document) {} } 

my-service.service.spec.ts

import { provide } from '@angular/core'; import { DOCUMENT } from '@angular/common';  import { MyService } from './my-service';  class MockDocument {}  describe('MyService', () => {   beforeEachProviders(() => ([     provide(DOCUMENT, { useClass: MockDocument }),     MyService   ]));    ... }); 
like image 93
Günter Zöchbauer Avatar answered Oct 02 '22 09:10

Günter Zöchbauer