变量变化检测 - Angular

Bri*_*eno 6 angular

我对 Angular 还是比较陌生,我主要使用 VueJS。我想知道如何检测变量何时更新。我正在通过 DataService 更新我的变量。我读过,ngOnChanges()但我看到这仅适用于输入。

这几乎是我的代码:

import { DataService } from "../../service/my.service";

export class MainPage {
  myVar: String = ""; // this is the variable I want to listen when a change is made

   constructor (
    private data: DataService
   ) {}

   ngOnInit() {
    this.data.changeVar.subscribe(message => this.myVar = message);
  }
}
Run Code Online (Sandbox Code Playgroud)

我的服务

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

@Injectable()
export class DataService {

  private messageSource = new BehaviorSubject<string>("");
  changeVar = this.messageSource.asObservable();

  constructor() { }

  changeMyVar (message: string) {
    this.messageSource.next(message)
  }

}
Run Code Online (Sandbox Code Playgroud)

这是我更新变量的地方。

import { DataService } from "../../service/my.service";

export class AnotherPage {
  anotherVar: String = '';

  constructor(
    private data: DataService
  ) { }

  ngOnInit() {
    this.data.changeVar.subscribe(message => this.anotherVar = message)
  }

  myFunction () {
    this.data.changeMyVar("Hello"); // update variable to "Hello"
  }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!:)

Con*_*Fan 8

如果myVar仅在 中定义的 Observable 回调中更改,则ngOnInit可以在更改变量后调用方法:

export class MainPage {

    myVar: string = "";

    ngOnInit() {
        this.data.changeVar.subscribe(message => {
            if (message !== this.myVar) {
                this.myVar = message;
                this.doSomething();
            }
        });
    }

    private doSomething() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果myVar可以在其他地方更改(因为它是公共的),则可以在 getter/setter 中访问它,并在 setter 中调用该方法:

export class MainPage {

    private _myVar: string = "";

    get myVar(): string {
        return this._myVar;
    }
    set myVar(value: string) {
        if (value !== this._myVar) {
            this._myVar = value;
            this.doSomething();
        }
    }

    ngOnInit() {
        this.data.changeVar.subscribe(message => this.myVar = message);
    }

    private doSomething() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)