Isso não responde diretamente à pergunta, mas em várias ocasiões cheguei a essa questão do Stack Overflow para resolver algo que eu usaria $ watch nos angularJs. Acabei usando outra abordagem além da descrita nas respostas atuais e quero compartilhá-la caso alguém ache útil.
A técnica que eu uso para obter algo semelhante $watch
é usar um BehaviorSubject
( mais sobre o tópico aqui ) em um serviço Angular e permitir que meus componentes se inscrevam nele para obter (observar) as alterações. Isso é semelhante ao a $watch
em angularJs, mas requer um pouco mais de configuração e entendimento.
No meu 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;
});
}
}
No meu serviço
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});
}
}
Aqui está uma demonstração no Stackblitz