0

我正在尝试将具有配置文件 (datService.configuration) 的 Angular 服务 (DataService) 加载到组件 (Home) 中。在我的 Home 组件中,如果我不将 DataServiceConfiguration 添加到提供程序列表中,我会收到以下错误:

“未捕获(承诺):DataServiceConfiguration 没有提供者!(Home -> DataService -> DataServiceConfiguration)”

数据服务.ts:

import { Injectable } from 'angular2/core';
import { Http, Response, Headers, HTTP_PROVIDERS } from 'angular2/http';
import 'rxjs/add/operator/map'
import { Observable } from 'rxjs/Observable';
import { DataServiceConfiguration } from './dataService.configuration';

@Injectable()
export class DataService {

    private actionUrl: string;
    private headers: Headers;

    constructor(private _http: Http, private configuration: DataServiceConfiguration) {

        ...
    }

dataService.configuration.ts:

import { Injectable } from 'angular2/core';

@Injectable()
export class DataServiceConfiguration {
    public Server: string = "http://localhost/";
    public ApiPath: string = "api/v1/";
    public ApiUrl = this.Server + this.ApiPath;

    constructor() {
    }
}

主页.ts

import { DataService } from '../services/dataService';
import { DataServiceConfiguration } from '../services/dataService.configuration';

import {
    Headers,
    Http,
    HTTP_BINDINGS, 
    Request,
    RequestOptions,
    RequestOptionsArgs,
    HTTP_PROVIDERS
} from 'angular2/http';

@ng.Component({
  selector: 'home',
  templateUrl: './ng-app/components/public/home/home.html',
  directives: [AlbumTile, ProdutoTile, Promocao, SuperOfertas, Banner, Categorias, DestaquesDaHome],
  providers: [DataServiceConfiguration, DataService]
})
export class Home implements ng.OnInit {
    public lista: models.Lista;
    public pagina: number = 1;
    paginas: number = 1;

    constructor(private http: Http, private _dataService: DataService) {

    }
}

我不明白为什么需要将 DataServiceConfiguration 添加到我的 Home 组件中,因为我的 DataService 已经加载了它。有没有办法只将 DataService 添加到我的组件中?

4

1 回答 1

2

这有点奇怪,但只有组件才能在 Angular 中配置依赖注入(嗯,和bootstrap(),但本质上与根组件相同)。即,只有组件可以指定提供者。

providers如果组件具有指定的数组,则组件树中的每个组件都将获得一个关联的“注入器” 。我们可以把它想象成一个注入器树,它(通常)比组件树更稀疏。当需要(通过组件或服务)解决依赖关系时,会咨询此注入器树。第一个可以满足依赖的注入器就是这样做的。注入器树向上走,朝向根组件/注入器。

因此,为了让您的服务注入配置对象依赖项,该配置对象首先必须向注入器注册。即,在组件的providers数组中。此注册必须发生在您要使用/注入服务的组件处或之上的某个位置。

然后,您的服务应该能够注入注册的配置对象,因为它会在注入器树中找到它。

另请参阅Angular 2 - 在服务中包含提供者

于 2016-05-21T14:49:44.970 回答