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

Обнаружение изменений в Angular 2.0

У меня есть компонент Angular2.0:

import {Component, View, FORM_DIRECTIVES} from 'angular2/angular2';

@Component({
  selector: 'font-size-component',
  properties: ['fontSize'],
  events: ['fontSizeChanged']
})
@View({
  template: `<input id="fontSize" [(ng-model)]="fontSize"/>`,
  directives: [FORM_DIRECTIVES]
})
export class FontSizeComponent {
  constructor() {

  }
}

Теперь я хочу, чтобы этот компонент запускал событие (используя привязку события) при изменении ввода.

В Angular 1.X у меня было несколько вариантов (ng-change или $scope.$wacth). Я ищу аналогичное решение, поэтому при изменении ввода я смогу использовать eventemitter и запустить событие fontSizeChanged.

Спасибо,

Янив

4b9b3361

Ответ 1

  • Вы можете использовать javascript getters и сеттеры. Таким образом, ваш компонент будет выглядеть так:
import {Component, View, FORM_DIRECTIVES, EventEmitter} from 'angular2/angular2';

@Component({
    selector: 'font-size-component',
    properties: ['fontSize'],
    events:     ['fontSizeChange']
})
@View({
    template: `
        <input id="fontSize" [(ng-model)]="fontSizeModel"/>
    `,
    directives: [FORM_DIRECTIVES]
})
export class FontSizeComponent {
    fontSize: string;
    fontSizeChange = new EventEmitter();

    get fontSizeModel() {
        return this.fontSize;
    }

    set fontSizeModel(value) {
        this.fontSizeChange.next(value);
    }
}

Отметьте этот plnkr

  1. Немного другое решение заключается в использовании привязки события (input):
@Component({
    selector: 'font-size-component',
    properties: ['fontSize'],
    events:     ['fontSizeChange']
})
@View({
    template: `
        <input 
          id="fontSize" 
          [value]="fontSize" 
          (input)="fontSizeChange.next($event.target.value)"
        />
    `,
    directives: [FORM_DIRECTIVES]
})
export class FontSizeComponent {
    fontSize: string;
    fontSizeChange = new EventEmitter();
}

Смотрите этот plnkr

Ответ 2

Вы также можете нажать на крючки жизненного цикла Angular2. Из документации:

ngOnChanges (changeRecord) {...}
Вызывается после каждого изменения свойств ввода и перед обработкой содержимого или дочерних представлений.

См. https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html

Просто добавьте этот метод в свой класс компонента:

ngOnChanges(changes: {[propertyName: string]: SimpleChange}) {
  if (changes['fontSize']) { // fire your event }
}

В приведенном выше руководстве содержится Plunkr для этого: https://angular.io/resources/live-examples/lifecycle-hooks/ts/plnkr.html

Ответ 3

Если вы хотите вручную обрабатывать изменения на входе, вы можете выделить короткий [[ngModel]], выполнив что-то вроде этого:

<input id="fontSize" [ngModel]="fontSize" (ngModelChange)="fontSizeChange($event)"/>

Убедитесь, что в функции fontSizeChange($event) вы используете $event для назначения измененного входного значения переменной fontSize, поскольку это больше не выполняется автоматически.

Когда вы используете [(ngModel)], он действительно делает что-то вроде этого:

<input id="fontSize" [ngModel]="fontSize" (ngModelChange)="fontSize=$event" />

Для получения дополнительной информации вы можете обратиться к официальной документации: https://angular.io/docs/ts/latest/guide/template-syntax.html#!#two-way-binding-with-ngmodel

В настоящее время Angular 2 все еще находится в состоянии бета-версии, поэтому это может быть изменено.