我有一個聲明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>
你究竟在哪裏打算通過這些wsAuthKey和wsHost?它們是特定於應用程序還是特定組件?它看起來並不像你想在你的例子中傳遞任何東西,所以目前還不清楚它應該如何工作。 – estus
這些數據是特定於使用組件的應用程序的(雖然該服務提供了默認值)。我期待從組件內提供它們? (我在問題中添加了一小段)@estus –
當然,它們在構造函數中是未定義的。它們是綁定的,不適用於施工。而且,我認爲沒有理由讓它們成爲綁定(Input),它們沒有改變。這完全取決於如何使用這些值。是否有真正的理由爲什麼這些值應該通過attrs傳遞,或者如果您需要它,您正試圖提供此功能?這將使整個事情變得更加複雜。您需要提供有關MetricsService如何工作的詳細信息 - 例如,它可能不是單身人士。 – estus