TORNAR

$watch amb Angular 2

2 min de lectura

En el meu post anterior, vaig estar parlant sobre com implementar esdeveniments d'Angular 1 en Angular 2. Però en el fragment de codi que utilitzo com a exemple podem trobar una altra cosa que no existeix en Angular 2: $watch.

Començo definint el problema. Podem tenir una directiva o component d'Angular 1 com aquest:

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 volem migrar aquest codi a Angular 2 trobem un problema: el nou Angular no té scope, així que no té $watch. Com podem observar un atribut de directiva? La solució és la sintaxi set d'ES6.

La sintaxi set vincula una propietat d'objecte a una funció per ser cridada quan hi ha un intent d'establir aquesta propietat.

De MDN

Així que podem vincular l'entrada per a un component a una funció que fa el mateix que la funció $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;
}
}