13

I'm fairly new to Angular, I work mainly with VueJS. I want to know how I can detect when a variable gets updated. I'm updating my variable through a DataService. I read about ngOnChanges() but I saw that this only works for inputs.

This is pretty much my code:

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);
  }
}

my.service

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)
  }

}

This is where I'm updating the variable.

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"
  }
}

Any help is greatly appreciated! :)

2
  • 1
    Since you assign a new value to myVar in the Observable callback, you know when it changes. What other information do you want to get? Commented Apr 22, 2018 at 3:35
  • I want to run a function in MainPage when the value of the variable has been changed. Commented Apr 22, 2018 at 12:57

3 Answers 3

18

If myVar is changed only in the Observable callback defined in ngOnInit, you can call a method after changing the variable:

export class MainPage {

    myVar: string = "";

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

    private doSomething() {
        ...
    }
}

On the other hand, if myVar can be changed in other places (since it is public), you can access it in a getter/setter, and call the method in the 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() {
        ...
    }
}
Sign up to request clarification or add additional context in comments.

3 Comments

Thank you, your example helped a lot! :)
Im trying to use your solution, but I get "Parameter 'message' implicitly has an 'any' type". When I do message: any still does not work. Any suggestion? Thanks!
I think that something like subscribe((message: string) => ... would eliminate the error message (assuming that message is a string).
0

You can try use this: https://angular.io/api/core/OnChanges

and get the object changes with: changes.objectName

more details on the angular.io page.

1 Comment

1. Its recommended adding solution as part of your answer along with any external link. 2. Please refer to this for better presenting your question/answer: meta.stackoverflow.com/a/251362/3519504
0

You can try use ChangeDetectorRef.

See this example

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.