2

Angular 2 で一般化されたデータ サービスを作成しようとしていますが、奇妙なエラーが発生します。基本的に、複数のケースで使用できるように、メソッドが API URL の一部を受け取る HTTP サービスを作成しています。たとえば、'projects/' を渡し、'api/' と結合して 'api/projects/' を取得し、それを http 呼び出しで使用したいと考えています。

私の現在のdataService.ts:

import { Injectable } from '@angular/core';
import { Http, Response, Headers } from '@angular/http';
import 'rxjs/add/operator/map'
import { Observable } from 'rxjs/Observable';
import { Configuration } from '../app.constants';

@Injectable()
export class DataService {

    private actionUrl: string;
    private headers: Headers;

    constructor(private _http: Http, private _configuration: Configuration, public action: string) {

    this.actionUrl = _configuration.ApiUrl

    this.headers = new Headers();
    this.headers.append('Content-Type', 'application/json');
    this.headers.append('Accept', 'application/json');
    }

    public GetAll (action: string): Observable<any> {
        return this._http.get(this.actionUrl + action).map((response: Response) => <any>response.json());
    }

    public GetSingle (action: string, id: number): Observable<Response> {
        return this._http.get(this.actionUrl + action + id).map(res => res.json());
    }

    public Add (action: string, itemToAdd: any): Observable<Response> {
        var toAdd = JSON.stringify(itemToAdd);

        return this._http.post(this.actionUrl + action, toAdd, { headers: this.headers }).map(res => res.json());
    }

    public Update (action: string, id: number, itemToUpdate: any): Observable<Response> {
        return this._http
        .put(this.actionUrl + id, JSON.stringify(itemToUpdate), { headers: this.headers })
        .map(res => res.json());
    }

    public Delete (action: string, id: number): Observable<Response> {
        return this._http.delete(this.actionUrl + id);
    }
}

'projects' をパラメータとして GetAll を呼び出そうとしているコンポーネント:

import { Component, OnInit } from '@angular/core';
import { DataService } from '../services/dataService';

@Component({
    selector: 'project-detail',
    templateUrl: 'app/project/project-detail.component.html'
})
export class ProjectDetailComponent implements OnInit{
    projects: Object[];

    constructor(private _dataService: DataService) {}

    getProjects(): void {
        this._dataService.GetAll('projects').subscribe(projects => this.projects = projects);
    }
    ngOnInit(): void {
        this.getProjects();
    }
}

app.module.ts にプロバイダーとしてサービスを追加しました。もう 1 つ注目すべき点は、ここで示したコンポーネントは、AppComponent 内にある HomeComponent というコンポーネントの子コンポーネントであることです。

HomeComponent は次のようになります。

import { Component, OnInit } from '@angular/core';
import { ProjectDetailComponent } from '../project/project-detail.component';


@Component({
    selector: 'home',
    templateUrl: '<project-detail></project-detail>'
})

export class HomeComponent {}

エラー:

EXCEPTION: Uncaught (in promise): Error: Error in      app/home/home.component.html:2:0 caused by: No provider for String!

GetCall に渡す文字列について不平を言っていることは知っていますが、その理由はわかりません。

どんな助けでも大歓迎です!

4

1 に答える 1

5

任意のものを注入することはできません。注入しようとするものはすべて、注入可能になるように構成する必要があります。ほとんどの場合、これは単にクラスをprovidersリストに追加することを意味します。文字列の場合は、それほど単純ではありません。いくつかのことを行う必要があります。

  1. まず、トークン1を作成する必要があります
  2. 次に、そのトークンを使用して、挿入する文字列を構成します。
  3. 次に、同じトークンを@Inject使用して、ターゲットに入れます。

import { OpaqueToken } from '@angular/core';

// 1. Create token
export const ACTION = new OpaqueToken('app.action');

// 2. Configure the `providers` (Maybe in the AppModule)
providers: [
  { provide: ACTION, useValue: 'the value you want'
]

import { Inject } from '@angular/core';

export class DataService {
  // 3. Injection target 
  constructor(@Inject(ACTION) action: string) {}
}

1 -依存性注入トークンを参照


アップデート

さて、Angular 4InjectionTokenでは、OpaqueToken

于 2016-09-22T02:12:33.217 に答える