angular - 在 Angular 6 中的组件和服务之间共享变量
问题描述
我需要在 Angular 6 中实现加载/微调器图像。当 HTTP 服务发送请求时应该显示微调器,并在服务接收到响应时隐藏。
我在一个组件中实现了图像,注意loading
变量:
@Component({
selector: 'my-spinner',
templateUrl: `
<div class="center-all" *ngIf="loading">
<img src="spinner.gif"></img>
</div>
`,
styles: [ `
.center-all {
position: fixed;
top: 0;
left: 0;
z-index: 99999;
margin: -8px;
}
`],
})
export class MySpinnerComponent {}
我的 HTTP 服务应该直接更改loading
变量(不通过声明MySpinnerComponent
和调用 的父组件MyHttpService
)。
@Injectable({
providedIn: 'root'
})
export class MyHttpService {
loading = false;
constructor(private http: HttpClient) {}
static handleError (error: Response) {
console.error(error);
return Observable.throw(error || 'Server error');
}
public call (params) {
this.loading = true; // how to share this variable with the spinner component?
return this.http.post<any>(params.url, params.data).
pipe(
map(response => response),
tap(this.loading = false),
catchError(VbkHttpService.handleError)
);
}
}
在 AngularJS 中,我声明了变量,$rootScope
以便我可以共享它。但是如何在 Angular 6 中实现等价物呢?
解决方案
将事件发射器添加到服务
loadingChange=new EventEmitter<boolean>();
每次更改字段时,使用;loading
发出事件this.loadingChange.emit(this.loading)
并在微调器组件中订阅该事件发射器。
@Component({
selector: 'my-spinner',
templateUrl: `
<div class="center-all" *ngIf="loading">
<img src="spinner.gif"></img>
</div>
`,
styles: [ `
.center-all {
position: fixed;
top: 0;
left: 0;
z-index: 99999;
margin: -8px;
}
`],
})
export class MySpinnerComponent{
loading=false;
constructor(private service:MyService){
this.myService.loadingChange.subscribe(flag=>this.loading=flag);
}
}
或者
您也可以简单地将loading
字段设为公开并直接从时间表访问它,如下所示:
服务:
public loading;
零件
@Component({
selector: 'my-spinner',
templateUrl: `
<div class="center-all" *ngIf="service.loading">
<img src="spinner.gif"></img>
</div>
`,
styles: [ `
.center-all {
position: fixed;
top: 0;
left: 0;
z-index: 99999;
margin: -8px;
}
`],
})
export class MySpinnerComponent{
constructor(private service:MyService){
}
}
我只是更喜欢“发射器”的方式
推荐阅读
- r - 当向量中的至少一个对象与其他向量中的至少一个对象匹配时,对列进行分组和索引 r dplyr
- linux - 如何使用PowerShell递归搜索目录和子目录中的所有文件?
- python - Pythons talib.ATR 方法是否有错误?
- c# - 如何在 C# Win 表单中将 Where 子句与 DataSet 一起使用
- powershell - 有没有办法找到脚本中需要的每个模块?
- javascript - Graphql 调用后处理错误和显示消息的正确方法
- optimization - CPLEX 中的有限解抛光
- r - 异常值检测的邻域计算
- reactjs - 一定长度后动态突出显示字符?
- apache-spark - 如何在 kubernetes 中连接 2 个 pod,因为它们位于同一个本地网络中并打开所有端口