0

構成ファイル (datService.configuration) を持つ Angular サービス (DataService) をコンポーネント (ホーム) にロードしようとしています。Home コンポーネントで、DataServiceConfiguration をプロバイダー リストに追加しないと、次のエラーが発生します。

「キャッチされていない (約束): DataServiceConfiguration のプロバイダーがありません! (ホーム -> DataService -> DataServiceConfiguration)」

dataService.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) {

    }
}

DataService が既に読み込まれているため、ホーム コンポーネントに DataServiceConfiguration を追加する必要がある理由がわかりません。コンポーネントに DataService のみを追加する方法はありますか?

4

1 に答える 1

2

少し奇妙ですが、コンポーネントのみが Angular で依存性注入を構成できます (まあ、そしてbootstrap()ですが、それは基本的にルート コンポーネントと同じです)。つまり、コンポーネントのみがプロバイダを指定できます。

providersコンポーネントに配列が指定されている場合、コンポーネント ツリー内の各コンポーネントは、関連付けられた「インジェクター」を取得します。これは、コンポーネント ツリーよりも (通常ははるかに) まばらなインジェクター ツリーのように考えることができます。依存関係を (コンポーネントまたはサービスによって) 解決する必要がある場合、このインジェクター ツリーが参照されます。依存関係を満たすことができる最初のインジェクターがそうします。インジェクター ツリーは、ルート コンポーネント/インジェクターに向かって上に移動します。

したがって、サービスが構成オブジェクトの依存関係を挿入するには、まずその構成オブジェクトをインジェクターに登録する必要があります。つまり、コンポーネントのproviders配列です。この登録は、サービスを使用/挿入するコンポーネントのどこかで行う必要があります。

サービスは登録済みの構成オブジェクトを注入できるはずです。これは、インジェクター ツリーで見つけるためです。

Angular 2 - サービスにプロバイダーを含めるも参照してください。

于 2016-05-21T14:49:44.970 に答える