2016-11-25 11 views
2

コンポーネントのライフサイクル中に何か共通のことができるようにコンポーネントの基本クラスを作成したいと考えています。私はまた、いくつかのサービスにアクセスするための基本クラスが必要です。どのように私はそれを注入するのですか?もちろん、サービスの代わりにシングルトンを使うこともできますが、シンプトンはアンチパターンであるため、タイプスクリプトでなくてもそれほど角張っていないと思います。 挨拶し、 ダニエルAngular2サービスをコンポーネントベースクラスに注入

EDIT:

これは好ましくなくて、現在作業していて、Angular2ドキュメントが言うように、私はむしろConnectionService @Injectableを(作る)と、リモコンのコンストラクタにそれを注入することが期待されているものですそれを子コンポーネントプロバイダリストに追加する必要があります。

子コンポーネント:

@Component(...) 
export class SomeComponent extends RemoteController { 
    sendRequest() { 
     this.request('something'); 
    } 
} 

基本クラス:

export class RemoteController implements OnInit { 
    public connection: SocketIOClient.Socket; 
    constructor() { 
     this.connection = RemoteService.connect('ws://localhost:8500'); 
    } 
    request(name: string) { 
     this.connection.emit('request', name); 
    } 
    ngOnInit() { 
     ... 
    } 
} 

シングルトンソリューション:

class ConnectionService { 
    private sockets: { [key: string]: SocketIOClient.Socket }; 
    constructor() { 
     debugger; 
     this.sockets = {}; 
    } 
    connect(url: string) { 
     return (url in this.sockets) ? this.sockets[url] : io.connect(url); 
    } 
} 
let RemoteService = new ConnectionService(); 

export { RemoteService }; 

答えて

1

Angular2が唯一のコンストラクタ・インジェクションをサポートしています。あなたは、スーパークラスとサブクラスを持っていて、スーパークラスに注入したい場合は、サブクラスにコンストラクタのパラメータを追加し、これだったサブクラス

export class RemoteController implements OnInit { 

    constructor(public connection: SocketIOClient.Socket) { 
     this.connection = RemoteService.connect('ws://localhost:8500'); 
    } 
@Component(...) 
export class SomeComponent extends RemoteController { 
    constructor(connection: SocketIOClient.Socket) { 
     super(connection 
+0

に転送する必要があります間違いなく私が聞きたかったものではありません。私はReflectiveInjectorを使ったプログラム注入についても少し読んだが、うまく動作するようにはなっていなかった。私はこの不満足な答えを受け入れる前にもう少し詳しく調査します(とにかくGünterありがとう) – Daniel

+0

'ReflectveInjector'を使用する場合、アプリケーションインジェクタを注入する必要があります。私はサンプルコードでいくつかの回答を投稿しました。私は回避しようとしないだろう、私はこれがうまくいくとは思わない。 –

+1

基本クラスのコンストラクタparmsに "public"、 "private"、 "protected"を追加しないでください。そうしないと、競合が発生します。この例には正しく含まれていませんが、わたしが理解するまでは、それを含めていました。 – vt5491