Búsqueda de sitios web

javascript - Cómo observar cambios en el enlace de un componente usando un componente de Angular


¿Cómo puedo escuchar el cambio de enlace de un componente de Angular y realizar acciones?

angular.module('myapp')
    .component('myComponent', {
        templateUrl: 'some.html',
        controller: MyController,
        controllerAs: 'myCtrl',
        bindings: {
            items: '<'
        }
    });

ahora, cuando items cambie, quiero realizar otra acción usando este valor,
¿Cómo puedo hacerlo?

Respuesta #1

Puedes agregar el método $onChanges al controlador

$onChanges(changesObj) se llama cada vez que se actualizan los enlaces unidireccionales. El changesObj es un hash cuyos claves son los nombres de las propiedades enlazadas que han cambiado, y los valores son un objeto del siguiente formato.

El siguiente ejemplo maneja el evento de cambio canChange.

angular.module('app.components', [])
.component('changeHandler', {
  controller: function ChangeHandlerController() {
    this.$onChanges = function (changes) {
      if (changes.canChange) 
       this.performActionWithValueOf(changes.canChange);
    };
  },
  bindings: {
    canChange: '<'
  },
  templateUrl: 'change-handler.html'
});

Requiere AngularJS >= 1.5.3 y funciona solo con enlace de datos unidireccional (como en el ejemplo anterior).

Docs: https://docs.angularjs.org/guide/component

Referencia: http://blog.thoughtram.io/angularjs/2016/03/29/exploring-angular-1.5-lifecycle-hooks.html

Respuesta #2

Ahora, cuando los elementos cambian, quiero realizar otra acción usando este valor. ¿Cómo puedo hacerlo?

Pero quiero evitar usar el $scope moribundo

Si no quieres usar $scope puedes usar un setter de propiedad para detectar cualquier cambio, por ejemplo:

class MyController {
    private _items: string[] = []
    set items(value:string[]){
        this._items = value;
        console.log('Items changed:',value);
    }
    get items():string[]{
        return this._items;
    }
}

const ctrl = new MyController();
ctrl.items = ['hello','world']; // will also log to the console

Tenga en cuenta que no debería usarlo para lógica compleja (razones: https://basarat.gitbooks.io/typescript/content/docs/tips/propertySetters.html) 🌹

Artículos relacionados