How to watch component binding change using Angular component

前端 未结 5 2039
醉梦人生
醉梦人生 2020-12-14 15:04

How can I listen to angular component binding change and perform actions?

angular.module(\'myapp\')
    .component(\'myComponent\', {
        templateUrl: \'         


        
相关标签:
5条回答
  • 2020-12-14 15:15

    Here's an ES5.1 version of basarat's answer:

    function MyController() {
      var items = [];
    
      Object.defineProperty(this, 'items', {
        get: function() {
          return items;
        },
    
        set: function(newVal) {
          items = newVal;
          console.log('Items changed:', newVal);
        }
      });
    }
    

    Using Object.defineProperty(). Supported by all major browsers and IE9+.

    0 讨论(0)
  • 2020-12-14 15:21

    now when items changes I want to perform another action using this value, How can I do it?

    But I want to avoid using the dying $scope

    If you don't want to use $scope you can use a property setter to detect any changes e.g. :

    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
    

    Please note that you shouldn't use it for complex logic (reasons : https://basarat.gitbooks.io/typescript/content/docs/tips/propertySetters.html)

    0 讨论(0)
  • 2020-12-14 15:22

    I've discovered a way but not sure it's the most efficient. First bring in $scope as a dependency and set it to this._scope or the like in your constructor. I have the following then in my $onInit function:

    this._scope.$watch(() => {
        return this.items;
      },
      (newVal, oldVal) => {
        // Do what you have to here
      });
    

    It's highly inspired by the answer here: Angularjs: 'controller as syntax' and $watch

    Hope it helps, it's what I'm going to use until I'm told otherwise.

    0 讨论(0)
  • 2020-12-14 15:24

    You can add the $onChanges method to the controller

    $onChanges(changesObj) is called whenever one-way bindings are updated. The changesObj is a hash whose keys are the names of the bound properties that have changed, and the values are an object of the form.

    Following example handles canChange change event.

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

    Requires AngularJS >= 1.5.3 and works only with one-way data-binding (as in the example above).

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

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

    0 讨论(0)
  • 2020-12-14 15:25

    Currently you can't use angular watchers without $scope as change detection is based around $scope. Even if you use expressions in HTML it would delegate watch functionality to $scope.

    Even if you create some other mechanism to watch you will need to remember to unwatch manually - and with $scope it's done automatically.

    0 讨论(0)
提交回复
热议问题