VOLVER

$watch con Angular 2

2 min de lectura

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