我正在尝试在组件中使用服务变量,但是当调用服务函数时,更新的变量在组件中没有变化
这是我的服务
import { Injectable } from '@angular/core';
import { environment } from 'environments/environment';
import { Observable } from 'rxjs/Observable';
const API_URL = environment.apiUrls.coreServiceUrl;
@Injectable()
export class LoadingBarService {
showspinner = {isStart : false};
start() {
this.showspinner.isStart = true;
console.log(this.showspinner);
console.log('start');
}
complete() {
this.showspinner.isStart = false;
console.log('complete');
}
}
我想在我的组件中使用showspinner,这是我的组件代码
component.ts
import { Component, OnInit, Input } from '@angular/core';
import { LoadingBarService } from './../../services/pageloader/spinner';
@Component({
selector: 'spinner',
templateUrl: './spinner.component.html',
styleUrls: ['./spinner.component.css']
})
export class SpinnerComponent implements OnInit {
showspinner;
public constructor(private loadingBarService: LoadingBarService) {
}
ngOnInit(){
this.showspinner = this.loadingBarService.showspinner;
}
}
component.html
<div *ngIf="showspinner.isStart" class="loading-icon"></div>{{showspinner | json}}
但此showspinner.isStart
变量未实时更新。
答案 0 :(得分:1)
您只是在ngOnInit上设置值..所以变量this.showSpinner永远不会改变。
一种解决方案是直接绑定服务中的值...不是很优雅,但在大多数情况下都可以使用。如果更改检测跳过此组件,则无效。
<div *ngIf="loadingBarService.showspinner" class="loading-icon"></div>{{showspinner | json}}
第二解决方案和推荐几乎相同,但使用了BehaivourSubject。使用这种方法,您将被激活,如果您在区域内执行操作,则由于异步管道和隐式markForCheck调用,将始终显示微调器。
@Injectable()
export class LoadingBarService {
private showspinner = new BehaviorSubject(false);
public isShowingSpinner$;
constructor() {
this.isShowingSpinner$ = this.showspinner.asObservable();
}
start() {
this.showspinner.next(true);
console.log(this.showspinner);
console.log('start');
}
complete() {
this.showspinner.next(false);
console.log('complete');
}
}
并且在您的html中使用异步管道订阅它,因此您确保调用markForCheck并且也更清晰。
<div *ngIf="loadingBarService.isShowingSpinner$ | async" class="loading-icon"></div>{{showspinner | json}}
希望这个帮助。