$watch con Angular 2
En mi post anterior, estuve hablando sobre cómo
implementar eventos de Angular 1 en Angular 2. Pero en el fragmento de código que
uso como ejemplo podemos encontrar otra cosa que no existe en Angular 2:
$watch.
Empiezo definiendo el problema. Podemos tener una directiva o componente de Angular 1 como este:
var module = angular.module("myApp");module.directive('exampleDirective', function () {return {template: '<div>{{internalVar}}</div>',scope: {externalVar: "="},controller: function(scope, element) {scope.$watch('externalVar', function(newVal, oldVal) {if (newVal !== oldVal) {scope.internalVar = newVal;}});}});
Si queremos migrar este código a Angular 2 encontramos un problema: el nuevo Angular
no tiene scope, así que no tiene $watch. ¿Cómo podemos observar un atributo de directiva?
La solución es la sintaxis set de ES6.
La sintaxis set vincula una propiedad de objeto a una función para ser llamada cuando hay un intento de establecer esa propiedad.
De MDN
Así que podemos vincular la entrada para un componente a una función que hace lo mismo que la
función $watch.
import { Component, Input } from '@angular/core';@Component({selector: 'example-component'})export class ExampleComponent {public internalVal = null;constructor() {}@Input('externalVal')set updateInternalVal(externalVal) {this.internalVal = externalVal;}}