Sté*_*uca 23 service constructor angular
我有一个声明MetricsService服务的组件.此服务需要http模块和两个定义主机和要使用的身份验证密钥的字符串.
指标服务如下:
@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";
}
Run Code Online (Sandbox Code Playgroud)
使用它的组件编写如下:
export class DatavizComponent implements OnInit, OnChanges {
constructor(
private zms: MetricsService,
) {
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我应该如何编写组件构造函数以使整个工作正常,包括传递主机和密钥(但不传递http)?
注意:当前编写的代码无法编译.
更确切地说,我希望该组件提供依赖于应用程序的数据,如下所示:
export class DatavizComponent implements OnInit, OnChanges {
constructor(
private zms = MetricsService("http://myhost.com", "mykey"),
) {
}
Run Code Online (Sandbox Code Playgroud)
但如果这个工作,如何通过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
);
}
Run Code Online (Sandbox Code Playgroud)
在组件中:
@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
) {
}
Run Code Online (Sandbox Code Playgroud)
在构造函数中,日志如下(值不传递):
MetricsService constructor= wsAuthKey=blahblah=, wsHost=https://preprod-admin.host.ws
Run Code Online (Sandbox Code Playgroud)
它应该显示'abc'和'efg'.
但我想知道使用dataviz componentsnet的组件是否存在问题.在此组件中,已传递以下信息:
@Input() private wsAuthKey:string;
@Input() private wsHost:string;
Run Code Online (Sandbox Code Playgroud)
正如我希望标签可选择预设主机和密钥:
<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>
Run Code Online (Sandbox Code Playgroud)
Gün*_*uer 33
您可以通过添加@Optional()(DI)和?(TypeScript)以及@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";
}
Run Code Online (Sandbox Code Playgroud)
providers: [
{provide: 'wsAuthKey', useValue: 'abc'},
{provide: 'wsHost', useValue: 'efg'},
]
Run Code Online (Sandbox Code Playgroud)
如果提供它们,它们会被传递,否则它们会被忽略,但DI仍然可以注入MetricsService.
Est*_*ask 14
这是一个常见的配方,特别是在这个问题中描述.它应该是一个包含配置的服务:
@Injectable()
export class MetricsConfig {
wsAuthKey = "blahblahblahblahblahblahblahblah=";
wsHost = "https://preprod-admin.myservice.ws";
}
@Injectable()
export class MetricsService {
constructor(
private http: Http,
metricsConfig: MetricsConfig
) {
this.wsAuthKey = metricsConfig.wsAuthKey;
this.wsHost = metricsConfig.wsHost;
}
}
Run Code Online (Sandbox Code Playgroud)
在需要更改的情况下,可以为整个模块或特定组件覆盖或扩展它:
@Component(
...
{ provide: MetricsConfig, useClass: class ExtendedMetricsConfig { ... } }
)
export class DatavizComponent ...
Run Code Online (Sandbox Code Playgroud)
MetricsConfig在这种情况下,没有必要上课.它也可以是OpaqueToken值提供者.但是一个类可以方便地扩展,它更容易注入并且已经提供了用于键入的界面.
| 归档时间: |
|
| 查看次数: |
26184 次 |
| 最近记录: |