2016-09-16 12 views
0

のindependantlyオブジェクトを注入:角度2依存性の注入 - 私は次のクラスがあるとし、コンストラクタ

export class Teacher { 
    constructor(public name: String, private age: number){} 
    ... 
} 

Teacher sがこのように作成されます。

const firstGradeTeacher: Teacher = new Teacher("Hannah", 32); 

私はロガーを追加します先生。ロガーはInjectable()です。思考の私の最初の行は、これを行うことでした。

export class Teacher { 
    constructor(public name: String, private age: number, private logger: Logger){} 
    ... 
} 

残念ながら、これは教師を構築し、今誰もがいずれかする必要があることを意味します

  1. 方法を知ってロガーや

    を持っていますロガーを構築するには

これは私が本当にやりたいことです:

export class Teacher { 
    private logger: Logger = Injector.get(); // <-- Does this exist? 
    constructor(public name: String, private age: number){} 
    ... 
} 

私はこれを行う方法がありますか?

+0

可能な重複(http://stackoverflow.com/questions/39409328/storing-injector-instance-for-use-in - コンポーネント) – estus

答えて

1

ルートインジェクタへのアクセスがa hackで可能です。

ただし、これはXYの問題を示します。クラスは、注射可能であるか非注射可能であると想定される。これらのコンセプトを組み合わせることはお勧めできません。角度でこれを行うには慣用的な方法がないからです。

注射不能クラスの工場がこれを処理する良い方法です。 【部品用インジェクタインスタンスを格納する]の

@Injectable() 
class TeacherFactory { 
    constructor(private logger: Logger) {} 

    public createInstance(...args) { 
    const teacher = new Teacher(...args); 

    // or pass it as extra argument if logger is used in Teacher constructor 
    teacher.logger = this.logger; 

    return teacher; 
    } 
} 

@Component({ 
    ... 
    providers: [TeacherFactory] 
}) 
class SomeComponent { 
    constructor(private teacherFactory: TeacherFactory){ 
    const firstGradeTeacher: Teacher = teacherFactory.createInstance("Hannah", 32); 
    } 
} 

または

// non-injectable class 
class TeacherFactory {} 

@Component({ 
    ... 
    providers: [{ 
    provide: TeacherFactory, 
    deps: [Logger], 
    useFactory: (logger: Logger) => (...args) => { 
     const teacher = new Teacher(...args); 
     teacher.logger = logger; 

     return teacher; 
    } 
    }] 
}) 
class SomeComponent { 
    constructor(private teacherFactory: TeacherFactory){ 
    const firstGradeTeacher: Teacher = teacherFactory("Hannah", 32); 
    } 
} 
-1

私はあなたがこのために探していると思う:

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

export class Teacher { 
    constructor(public name: String, private age: number, @Optional() private logger: Logger) { 
    if (this.logger) { 
     this.logger.log(some_message); 
    } 
    ... 
    } 
... 
} 
+1

悲しいことに、クラスが 'New Teacher(...)'のように直接インスタンス化されたとき、 'Logger'が自動的に注入されることはありません。 – estus

+0

あなたは正確に何をしたいのか分かりません。私が理解していることは、@Optional()でコンストラクタのロガーに注釈を付ける必要があるため、あなたのLoggerをオプションの依存関係にしたいということです。 – Omar

+0

質問は、教師のクラスがどのように使用されるべきかを説明します。インジェクタは、他のコンストラクタアノテーション(public name:String、private age:number)がプロバイダではないため、あなたの例からTeacherクラスをスローします。 – estus

関連する問題