Esto no responde la pregunta directamente, pero en diferentes ocasiones he llegado a esta pregunta de desbordamiento de pila para resolver algo que usaría $ watch en angularJs. Terminé usando un enfoque diferente al descrito en las respuestas actuales, y quiero compartirlo en caso de que alguien lo encuentre útil.
La técnica que uso para lograr algo similar $watch
es usar un BehaviorSubject
( más sobre el tema aquí ) en un servicio angular y dejar que mis componentes se suscriban para obtener (ver) los cambios. Esto es similar a un $watch
en angularJs, pero requiere un poco más de configuración y comprensión.
En mi componente:
export class HelloComponent {
name: string;
// inject our service, which holds the object we want to watch.
constructor(private helloService: HelloService){
// Here I am "watching" for changes by subscribing
this.helloService.getGreeting().subscribe( greeting => {
this.name = greeting.value;
});
}
}
En mi servicio
export class HelloService {
private helloSubject = new BehaviorSubject<{value: string}>({value: 'hello'});
constructor(){}
// similar to using $watch, in order to get updates of our object
getGreeting(): Observable<{value:string}> {
return this.helloSubject;
}
// Each time this method is called, each subscriber will receive the updated greeting.
setGreeting(greeting: string) {
this.helloSubject.next({value: greeting});
}
}
Aquí hay una demostración en Stackblitz