【问题标题】:How to track changes in a service in Angular4如何在 Angular4 中跟踪服务中的更改
【发布时间】:2018-03-22 16:11:50
【问题描述】:

请问我如何跟踪/观察服务中的变量或数组以检测其值是否已更改或已添加项目?

【问题讨论】:

标签: angular onchange watch


【解决方案1】:

问题是您对“跟踪/观看”的最终期望。 例如,您可以将变量放在 Subject 或 BehaviorSubject 中。然后订阅它。每当此主题发生变化时,您都会收到通知。

这是一个例子。

您的服务提供了放在 BehaviorSubject 中的变量“信息”。您可以通过 getter 和 setter 访问此变量。请注意,getter 返回一个 Observable,这对于监控变化很重要。

import { Observable } from 'rxjs/Rx';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Injectable } from '@angular/core';

@Injectable()
export class MyService {
  private info = new BehaviorSubject('information');

  getInfo(): Observable<string> {
    return this.info.asObservable();
  }

  getInfoValue(): string {
    return this.info.getValue();
  }

  setInfo(val: string) {
    this.info.next(val);
  }
}

在您的组件中,您执行以下操作

import { MyService } from 'my.service';

constructor(
    private myService: MyService
) { 

    /**
     * whenever your variable info inside the service changes
     * this subscription will get an event and immediately call the code
     * inside.
     */
    this.myService.getInfo().subscribe(value => {
        // do something with this value
        console.log('Info got changed to: ', value);
    });
}

这是监控服务内变量变化的最佳方式。

【讨论】:

  • 非常感谢。这是一个完美的答案。我的另一个问题是。当设备的位置发生变化时,我正在尝试更新 Mongodb 数据库中的位置字段。现在,我正在使用离子谷歌地图。但是看到很少的移动会导致位置值发生很多变化。不停地调用更新它的值来轰炸服务器会不会太过分了??
  • 我同意。这往往会导致大量不必要的网络流量。我建议你浏览整个 rxjs 框架的文档,因为有很多可能使用计时器和延迟来规范和控制这种行为。
  • 我会这样做的。谢谢十亿。你帮了很多忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
相关资源
最近更新 更多