2016-10-05 4 views
0

私は私のplatform=browserコード私は実行時に決定されてPlatform値を、ベースの右のインスタンスを作成するために、依存性注入を使用するにはどうすればよいangular2プラットフォームに応じて `@Ijectable`の別のサブクラスを得るにはどうすればよいですか?

import { Injectable } from '@angular/core'; 
import { Platform } from 'ionic-angular'; 
import { File } from 'ionic-native'; 

declare var window; 
@Injectable() 
export class ImageSrcService { 
    constructor(protected platform: Platform){ 
    if (platform.is('cordova')) { 
     // I want an instance of CordovaService 
    } else { 
     // I want an instance of BrowserService 
    } 
    } 
    getSrc(id: string) : Promise<string> {} 
} 

export class BrowserService extends ImageSrcService { 
    constructor(protected platform: Platform){ 
    super(platform); 
    } 
    getSrc(id: string) : Promise<string> { 
    const uri = `http://example.com/images/${id}.jpg`; 
    return Promise.resolve(uri); 
    } 
} 

export class CordovaService extends ImageSrcService{ 
    constructor(protected platform: Platform){ 
    super(platform); 
    } 
    getSrc(id: string) : Promise<string> { 
    // File.checkFile('/images/', `${id}.jpg`) 
    const fullPath = `/images/${id}.jpg`; 
    return new Promise<string>((resolve, reject)=>{ 
     window.resolveLocalFileSystemURL( 
     fullPath 
     , (fileEntry) => { 
      if (fileEntry.isFile) 
      return resolve(fileEntry.nativeURL); 
      reject("File not found"); 
     }); 
    }); 
    } 
} 

別に私のplatform=cordovaコードを維持するために、このような何かをしたいですか?

+0

サービスのインスタンスを2つ作成し、依存関係注入useFactory機能を使用して、注入するサービスを決定することができます。詳しくはこちらを参照してください:https://angular.io/docs/ts/latest/guide/dependency-injection.html – galvan

答えて

0

providersを設定するときは、ファクトリを使用できます。工場では、ImageSrcServiceのグローバルインスタンスとして返すべきものに基づいて、Platformを注入してそれに基づいて決定することができます。そして、すべてのあなたのサービスで、あなただけの任意の具体的な実装

providers: [ 
    { 
    provide: ImageSrcService, // token, this is what you inject 
    useFactory: (platform: Platform) => { 
     // do check and return the one to use 
     if (plaform.is('cordova') { 
     return CordovaSrcService(); 
     } else { 
     return new BroswerSrcService() 
     } 
    }, 
    deps: [ Platform ] 
    } 
] 

Platformが何であるかわからないのではなく、ImageSrcServiceを注入したが、これは、それは工場が呼び出された時点で利用可能であるプロバイダであることを前提としています。

+0

これは、 'ImageSrcService'をインポートする' Component'のプロバイダで正しいですか? 'ImageSrcService'自体のプロバイダではありません。 – michael

+0

アプリケーションスコープ付きサービス(1つのインスタンスのみ)の場合は、 '@ NgModule'です。 '@ Component'では、各コンポーネントが独自のインスタンス –

+0

を取得するようにしたいので、アプリケーションスコープのサービスであれば' @ NgModule'で 'provide'する必要がありますが、' import {ImageSrcService }から "..." 'どこにでも' @Inject'したいと思います。正しい? – michael

関連する問題