2017-02-22 25 views
8

我有一個聲明MetricsService服務的組件。該服務需要http模塊和兩個字符串,這兩個字符串定義主機和授權密鑰才能使用。如何編寫需要角2中參數的服務構造函數?

度量的服務如下:

@Injectable() 
export class MetricsService { 
    constructor(
     private http: Http, 
     public wsAuthKey: string, 
     public wsHost: string 
     ) { 
     this.wsAuthKey = wsAuthKey || "blahblahblahblahblahblahblahblah="; 
     this.wsHost  = wsHost || "https://preprod-admin.myservice.ws"; 
    } 

使用它是如下編寫的組件:

export class DatavizComponent implements OnInit, OnChanges { 
    constructor(
     private zms: MetricsService, 
    ) { 
    } 

我的問題是我應該怎麼寫的組件構造,使整個事情作品,包括傳遞主機和密鑰(但不傳遞http)?

注意:目前編寫的代碼不能編譯。

更確切地說,我希望該組件提供取決於應用的數據是這樣的:

export class DatavizComponent implements OnInit, OnChanges { 
     constructor(
      private zms = MetricsService("http://myhost.com", "mykey"), 
     ) { 
     } 

但是,如果這個工程,如何通過HTTP?

更新後提出的解決方案:

export class MetricsService { 

    constructor(
     private http: Http, 
     @Inject('wsAuthKey') @Optional() public wsAuthKey?: string, 
     @Inject('wsHost') @Optional() public wsHost?: string 
     ) { 
     this.wsAuthKey = wsAuthKey || "blahblah="; 
     this.wsHost  = wsHost || "https://preprod-admin.host.ws"; 


     console.log("MetricsService constructor=" 
      + " wsAuthKey="+this.wsAuthKey 
      + ", wsHost="+this.wsHost 
     ); 

    } 

在組件:

@Component({ 
    selector: 'dataviz-offers-volumes', 
    templateUrl: 'app/dataviz.component.html', 
    styleUrls: ['app/dataviz.component.css'], 
    encapsulation: ViewEncapsulation.None, 
    providers: [ 
     {provide: 'wsAuthKey', useValue: 'abc'}, 
     {provide: 'wsHost',  useValue: 'efg'}, 
    ], 
}) 
export class DatavizComponent implements OnInit, OnChanges { 

    @ViewChild('chart') private chartContainer: ElementRef; 
    @Input() private graphId:string; 
    @Input() private wsAuthKey:string; 
    @Input() private wsHost:string; 
    @Input() private maxSamples=12; 

    constructor(
     private zms: MetricsService 
    ) { 
    } 

在構造函數中,日誌如下(值不會傳遞):

MetricsService constructor= wsAuthKey=blahblah=, wsHost=https://preprod-admin.host.ws 

它應該顯示'abc'和'efg'。

但我想知道是否沒有使用dataviz組件的組件的問題。 在此組件中,下面的信息已通過了:

@Input() private wsAuthKey:string; 
@Input() private wsHost:string; 

正如我想的標記任選地預設的宿主和鍵:

   <h1>dataviz volume</h1> 
       <div class="chartContainer left" title="Simultaneous offers via dataviz directive"> 
        <dataviz-offers-volumes 
         id="dataviz-volumes1" 
         [graphId]="graphId" 
         [wsAuthKey]="'myauthkey'" 
         [wsHost]="'http://myhost.com'" 
         [maxSamples]="123" 
        > 
        </dataviz-offers-volumes> 
       </div> 
+0

你究竟在哪裏打算通過這些wsAuthKey和wsHost?它們是特定於應用程序還是特定組件?它看起來並不像你想在你的例子中傳遞任何東西,所以目前還不清楚它應該如何工作。 – estus

+0

這些數據是特定於使用組件的應用程序的(雖然該服務提供了默認值)。我期待從組件內提供它們? (我在問題中添加了一小段)@estus –

+0

當然,它們在構造函數中是未定義的。它們是綁定的,不適用於施工。而且,我認爲沒有理由讓它們成爲綁定(Input),它們沒有改變。這完全取決於如何使用這些值。是否有真正的理由爲什麼這些值應該通過attrs傳遞,或者如果您需要它,您正試圖提供此功能?這將使整個事情變得更加複雜。您需要提供有關MetricsService如何工作的詳細信息 - 例如,它可能不是單身人士。 – estus

回答

7

這是在this question描述的共同配方尤其是。這應該是保存配置的服務:

​​

在這種情況下,當需要改變時,它可以被覆蓋或擴展爲整個模塊或特定組件:

@Component(
    ... 
    { provide: MetricsConfig, useClass: class ExtendedMetricsConfig { ... } } 
) 
export class DatavizComponent ... 

有沒有真正的在這種情況下需要使MetricsConfig成爲一類。它也可以是一個OpaqueToken值提供者。但是一個類可以方便地擴展,它更容易注入並且已經提供了一個輸入界面。

+0

這是確定的方法 - – chrismarx

14

你可以說,不支持作爲提供商鍵加入了對原始值@Optional()(DI)和?(打字稿),並@Inject(somekey)可選參數

@Injectable() 
export class MetricsService { 
    constructor(
     private http: Http, 
     @Inject('wsAuthKey') @Optional() public wsAuthKey?: string, 
     @Inject('wsHost') @Optional() public wsHost?: string 
     ) { 
     this.wsAuthKey = wsAuthKey || "blahblahblahblahblahblahblahblah="; 
     this.wsHost  = wsHost || "https://preprod-admin.myservice.ws"; 
    } 
providers: [ 
    {provide: 'wsAuthKey', useValue: 'abc'}, 
    {provide: 'wsHost', useValue: 'efg'}, 
] 

如果他們它們通過,否則它們被忽略,但DI仍然可以注入MetricsService

+0

到目前爲止,除了提供者部分外,這很好:我把它放在使用服務的組件中,對嗎? –

+0

如果服務本身也在組件中提供,則可以將提供程序放入組件中。這些值需要提供與服務或更高級別相同的級別。 'AppModule'提供的服務無法從'MyComponent'注入值。 –

+0

因爲我這樣做了,並且組件提供的useValue中的值沒有傳遞給服務。我更新我的問題,以便您可以看到我現在的位置@AngularFrance –

相關問題