我有一个Angular2应用程序。为了在测试中模拟<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/preference_category_margin"
android:paddingRight="@dimen/preference_category_margin"
android:orientation="vertical">
<TextView android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:textStyle="bold"
android:textSize="13sp"
android:textAllCaps="false"
android:textColor="@color/colorAccent"/>
<TextView android:id="@android:id/summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="@color/colorAccent"
android:textAllCaps="false"/>
</LinearLayout>
对象,我想将它注入服务,如:
Document
角度的import { Document } from '??'
@Injectable()
export class MyService {
constructor(document: Document) {}
}
服务使用内部Title
方法:
有没有简单的方法将文档注入服务?另外,我应该如何在providers数组中引用它?
答案 0 :(得分:72)
Angular中直接支持这一点
https://angular.io/api/common/DOCUMENT
import { Inject, Injectable } from '@angular/core';
import { DOCUMENT } from '@angular/common';
@Injectable()
export class MyService {
constructor(@Inject(DOCUMENT) private document: Document) {}
}
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
]));
...
});
答案 1 :(得分:26)
我无法直接评论adamdport的问题(还没有50个代表点),但是这里有角度文档中所述。
块引用 @GünterZöchbauer看起来DOCUMENT已被弃用。一旦它消失,任何想法怎么做?例如,我如何动态设置favicon?
而不是像平台浏览器那样导入:
import { DOCUMENT } from '@angular/platform-browser';
从angular common:
导入它import {DOCUMENT} from '@angular/common';
答案 2 :(得分:7)
除了@GünterZöchbauer的回答。
Angular将DOCUMENT定义为InjectionToken
export const DOCUMENT = new InjectionToken<Document>('DocumentToken');
中注入文档
{provide: DOCUMENT, useFactory: _document, deps: []}
export function _document(): any {
return document;
}
因此,当我们使用它时,我们只需要注入@Inject(DOCUMENT)
或直接在deps:[DOCUMENT]
答案 3 :(得分:-2)
import { Inject, Injectable } from '@angular/core';
import { DOCUMENT } from '@angular/common';
@Injectable()
export class MyService {
constructor(@Inject(DOCUMENT) private document) {}
}
是引起问题的“:文档”。