2016-10-05 49 views
0

我想要做這樣的事情讓我platform=cordova代碼從我platform=browser代碼分開angular2如何根據平臺 - cordova或瀏覽器獲取「@ Injectable」的不同子類?

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值,這是在運行時確定正確的實例?

+0

您可以創建兩個服務實例,然後使用依賴注入useFactory功能,您可以決定注入哪個服務。請參閱以下內容以獲取更多信息:https://angular.io/docs/ts/latest/guide/dependency-injection.html – galvan

回答

0

當您配置providers時,您可以使用工廠。在工廠中,您可以注入Platform,並根據那個應該作爲ImageSrcService的全局實例返回的內容來決定。而在所有的服務,您只需注入ImageSrcService,而不是任何具體的實施

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是的,但這種假定它是一個供應商,可在工廠被調用的時候。

+0

這發生在導入「ImageSrcService」的Component的提供程序中,是否正確?不在「ImageSrcService」本身的提供者中。 – michael

+0

'@ NgModule',如果它是一個應用程序範圍的服務(只有一個實例)。在'@ Component'中,如果你想讓每個組件獲得它自己的實例 –

+0

,所以如果它是一個應用程序範圍的服務,我只需要在'@ NgModule'處提供''',但我仍然需要'import {ImageSrcService }從「...」無論我想要「@注入」它。正確? – michael