Подтвердить что ты не робот

Как наблюдать изменение привязки компонентов с помощью компонента Angular

Как я могу прослушивать изменение привязки компонента angular и выполнять действия?

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

теперь, когда изменения items я хочу выполнить другое действие, используя это значение,
Как я могу это сделать?

4b9b3361

Ответ 1

теперь, когда элементы меняются, я хочу выполнить другое действие, используя это значение, Как мне это сделать?

Но я хочу, чтобы избежать использования области памяти

Если вы не хотите использовать $scope, вы можете использовать средство настройки свойств для обнаружения любых изменений, например.:

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

Обратите внимание, что вы не должны использовать его для сложной логики (причины: https://basarat.gitbooks.io/typescript/content/docs/tips/propertySetters.html) 🌹

Ответ 2

Вы можете добавить метод $onChanges к контроллеру

$onChanges(changesObj) вызывается при обновлении односторонних привязок. ИзмененияObj - хэш, ключи которого являются именами связанных свойств, которые изменились, а значения являются объектом формы.

В следующем примере обрабатывается событие canChange change.

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

Ответ 3

Здесь приведен пример версии basarat версии ES5.1:

function MyController() {
  var items = [];

  Object.defineProperty(this, 'items', {
    get: function() {
      return items;
    },

    set: function(newVal) {
      items = newVal;
      console.log('Items changed:', newVal);
    }
  });
}

Использование Object.defineProperty(). Поддерживается всеми основными браузерами и IE9 +.

Ответ 4

Я нашел способ, но не уверен, что он наиболее эффективен. Сначала введите $scope в качестве зависимости и установите его в this._scope или тому подобное в своем конструкторе. В моей функции $onInit у меня есть следующее:

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

Он очень вдохновлен ответом здесь: Angularjs: "контроллер как синтаксис" и $watch

Надеюсь, это поможет, это то, что я собираюсь использовать, пока мне не говорят иначе.

Ответ 5

В настоящее время вы не можете использовать angular наблюдателей без $scope, поскольку обнаружение изменений основано на $scope. Даже если вы используете выражения в HTML, делегировать функции наблюдения в $scope.

Даже если вы создаете какой-то другой механизм для просмотра, вам нужно будет помнить, что вы не вручную, а с помощью параметра $scope это делается автоматически.