如何订阅更改变量?

Posted

技术标签:

【中文标题】如何订阅更改变量?【英文标题】:How subscribe to change variable? 【发布时间】:2018-02-21 08:43:29 【问题描述】:

请帮助我订阅更改的变量。我制作简单的微调器。 Spinner 状态(true|false) 存储在服务中:

import  Injectable  from '@angular/core';
import  Response, Headers, URLSearchParams  from '@angular/http';
import  Observable  from 'rxjs/Observable';

@Injectable()
export class GlobalVarsService 
    private isVisibleSpinner: boolean = false;

  getSpinnerState(): Observable<boolean> 
    return this.isVisibleSpinner;
  ; 

  setSpinnerState(state): void 
    console.log('setSpinnerState', state);
    this.isVisibleSpinner = state;
  ;    

在组件模板中,我通过条件显示微调器:

<div class="nav">
  <a [routerLink]="['/select']">select</a>
  <a [routerLink]="['/output']">output</a>
</div>

<router-outlet></router-outlet>

<div class="spinner-backdrop" *ngIf="isVisibleSpinner"></div>
<div class="spinner-area" *ngIf="isVisibleSpinner">
    <span class="spinner">loading...</span>
</div>

在组件中,我尝试订阅更改服务 isVisibleSpinner 变量:

import  Component  from '@angular/core';
import  Response  from '@angular/http';
import 'rxjs/add/operator/map'
import  GlobalVarsService  from './services/global-vars.service';

@Component(
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
)
export class AppComponent 
    private isVisibleSpinner: boolean;

  constructor(private globalVarsService: GlobalVarsService)   
        this.globalVarsService.getSpinnerState().subscribe(data => 
          console.log(data);
          this.isVisibleSpinner = data;
        );     
  

但控制台输出跟随错误消息:

类型 'boolean' 不可分配给类型 'Observable'。

【问题讨论】:

因为您要返回一个可观察对象并将值放入布尔值,您可以将可观察对象映射到所需的类型 【参考方案1】:

因为您要返回一个可观察对象并将值放入布尔值,所以您可以将变量的类型更改为可观察对象,并使用异步管道获取值或将您的“数据”映射为布尔值,如果这是您想要的

export class AppComponent 
    private isVisibleSpinner: Observable<boolean>;

  constructor(private globalVarsService: GlobalVarsService)   
        this.globalVarsService.getSpinnerState().subscribe(data => 
          console.log(data);
          this.isVisibleSpinner = data;
        );     
  

app.component.html

<div class="spinner-backdrop" *ngIf="isVisibleSpinner | async"></div>
<div class="spinner-area" *ngIf="isVisibleSpinner | async">
    <span class="spinner">loading...</span>
</div>

【讨论】:

以上是关于如何订阅更改变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 knockout.js 订阅变量状态更改

带有 Meteor 的 Blaze-Apollo,观察者不会触发变量更改的订阅

Angular:全局变量在订阅函数内没有改变

为暂停的订阅正确的贝宝 IPN 变量

如何在 useSubscription 挂钩中更新订阅变量 - Apollo v3

Paypal 订阅 IPN 自定义变量