angular2 +:组件

时间:2017-12-29 07:15:59

标签: angular components angular-services angular-components

我正在尝试在组件中使用服务变量,但是当调用服务函数时,更新的变量在组件中没有变化

这是我的服务

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变量未实时更新。

1 个答案:

答案 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}}

希望这个帮助。