2017-09-15 15 views
2

私の角4に関する知識は初心者レベルです。私はいくつかのように、以下のコンポーネントで共有モジュールからサービスを提供しようとしています:共有モジュールからのサービスが表示されていません - 角度4

プロジェクト構造

app 
|_ component1 
    |_ .css 
    |_ .html 
    |_ .component.ts 
    |_ .module.ts 
|_ component2 
    |_ //same as above 
|_ shared 
    |_ messages.components.ts 
    |_ number.directive.ts 
    |_ shared.module.ts 
    |_ validation.service.ts 

問題今、私は私のshared.module.tsなどを持って

以下:

//Certain other imports 
import { ValidationService } from './validation.service'; 
@NgModule({ 
    declarations: [...], 
    imports : [....], 
    exports : [....], 
    providers : [ValidationService] 
}); 

export class SharedModule{} 

B

:ELOWはvalidation.service.ts

import { Injectable } from '@angular/core'; 
@Injectable() 
export class ValidationService { 

    static validateText(control) { 
      //do something 
    } 
} 

の内容は、今私はcomponent2ValidationServiceを消費しようとしていて、そのために、私は以下のようにcomponent2のモジュールでSharedModuleをインポートしたありますcomponent2.module.ts

import { SharedModule } from './../shared/shared.module'; 
//some other imports 
@NgModule({ 
    declarations: [], 
    imports: [SharedModule] 
}) 
export class Component2Module { } 

component2.com ponent.tsは以下の通りです:

import { SharedModule } from './../shared/shared.module'; 
//other imports 
@Component({ 
    selector: 'app-root', 
    templateUrl: './component2.component.html', 
    styleUrls: ['./component2.component.css'] 
}) 
export class Component2Component implements OnInit{ 
    constructor(){ 
    } 
    ngOnInit() { 
    this.sampleForm = new FormGroup({ 
     sampletxt : new FormControl('', [Validators.required , ValidationService.validateText]), //this method here 
    }); 
    } 
} 

しかし、私は上記のファイルに再度インポートしない限り、このValidationServiceを使用することはできませんよ。

私はコンポーネント2モジュールにSharedModuleをインポートしたとSharedModuleはすでにServiceを提供している?ので、私のcomponent2でそれをインポートせずValidationServiceを使用することはできませんよ、なぜここに私の質問ですか私はここで何が欠けていますか?これはまったく不可能ですか?

答えて

3

imports: []@NgModule()のサービスを追加すると、依存関係注入フレームワーク(DI)に登録されます。

コンポーネントをコンストラクタパラメータにリストすることによって、コンポーネントのインスタンスを作成するときに、サービスにコンストラクタを渡すようにDIに指示します。

constructor(private validationService:ValidationService){ 

活字体はあなたが何を意味するかValidationService知っているため(プロジェクトまたはインポートモジュール内のいくつかがあるかもしれないが)あなたはこれを明確にするインポートを追加する必要があります。あなたは

this.validationService... 
+0

のようにそれを使用することができます。その後

は簡単いただきありがとうございます。 1つの小さな疑いがここにあります。私はサービス内で静的メソッドを持っています。コンストラクタに追加するには、ここでそれが必要でしょうか? –

+1

サービスで静的メソッドを使用しないでください。サービスの静的メソッドを使用する場合は、実際にはサービスではなく、そのように扱うべきではありません。このようなクラスを 'imports:[...]'や 'providers:[...]'に追加する必要はありません。TypeScriptのインポートが必要です。 –

+1

ようこそ。良いアイデア。 Angularは、すべてを簡単にテストできるフレームワークを作るために長い道のりを歩んだ。静的メソッドを使用すると、この大きな利点が再び働きます。 –