2017-03-04 15 views
1

Q1。私はいくつかのユーティリティ/ヘルパーメソッド(get/postリクエストなし)を持つ共通のユーティリティクラスを持っています。私が最初に尋ねなければならないことは、単純なクラスであろうと、それとも@Injectableクラスでなければならないかということです。両方この角2のコンストラクタ注入対直接アクセス

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

Injectable() 
export class Utils { 
} 

OR

export class Utils { 
} 

Q2のように任意のコンポーネントクラスにインポートした後に使用することができるからです。それは、注射だ場合、私は、コンストラクタで注入し、私のコンポーネントクラスでこれをインポートする必要があり、その後、私は

import { Utils } from './../shared/utils'; 

@Component({ 
    moduleId: module.id, 
    selector: 'abc', 
    templateUrl: './abc.component.html', 
    providers: [Utils] 
}) 

export class DemoComponent implements OnInit { 

    constructor(private _u: Utils) { } 

    ngOnInit(): void { 
     this._u.someMethod(); 
    } 
} 

のようなしかし、この横に注入されたクラス/サービスのいずれかの方法を使用することができますプロバイダの配列に追加している必要があります私は、直接私がより良いと推奨されるアプローチである1を知りたいと思った短い道

import { Utils } from './../shared/utils'; 

@Component({ 
    moduleId: module.id, 
    selector: 'abc', 
    templateUrl: './abc.component.html' 
}) 

export class DemoComponent implements OnInit { 

    constructor() { } 

    ngOnInit(): void { 
     Utils.someMethod(); 
    } 
} 

のようなショーである、コンストラクタ・インジェクションなしとプロバイダを追加することなく、サービスのメソッドにアクセスすることができますか?

答えて

1

あなたは、コンストラクタでそれを使用している、

  1. あなたはあなたのコンポーネント間でのサービスの個別のインスタンスを使用します。
  2. Injectable()として使用する場合は、モジュールの配列内で宣言する必要があります。ダイレクトアクセスの場合は

    constructor(private _u: Utils) { } 
         ngOnInit(): void { 
           this._u.someMethod(); 
         } 
    
    //private - _u => is specific inside this component 
    

それは次のような問題

  1. メモリーまで、観測の場合は
  2. あまり再利用
  3. をリークを作成する可能性のあるであるとして、リソースが使用されています観察可能なものは登録解除されていますので、再度購読することはできません。
+0

したがって、すべてのヘルパークラスはコンストラクタインジェクションで使用する必要がありますか?そして、どのようにサービスでコンポーネントのインスタンスを分離することができるのは、常にシングルトンですか? –

+0

厳密にはそうではありませんが、大部分の場合は、それが注入されるべきです。 – Aravind

+0

観測可能なものがなくても、フラットなメソッドだけですか? –

1

Q1。あなたがコンポーネントのプロバイダの配列にサービスを追加する必要が両方のケースで

// 1 case 

    @Injectable() // <--- required 
    export class Utils { 
     constructor(private _otherService : OtherService){} 
    } 


    // 2 case 
    @Injectable() // <--- not required 
    export class Utils { 
     constructor(){} 
    } 

Utilsは、他のサービスに依存しませんが、それがない場合は、@Injectable()デコレータを使用する必要がある場合@Injectable()は必要ありません。

Q2。最初のアプローチは、MockUtilsサービスを渡してコンポーネントをテストすることが容易になるためです。

関連する問題