Я пытаюсь обнаружить изменение ngModel
в <select>
теге. В Angular 1.x мы могли бы решить эту проблему с помощью $watch
включения ngModel
или использования ngChange
, но я еще не понял, как обнаружить изменение ngModel
в Angular 2.
Полный пример : http://plnkr.co/edit/9c9oKH1tjDDb67zdKmr9?p=info
import {Component, View, Input, } from 'angular2/core';
import {FORM_DIRECTIVES} from 'angular2/common';
@Component({
selector: 'my-dropdown'
})
@View({
directives: [FORM_DIRECTIVES],
template: `
<select [ngModel]="selection" (ngModelChange)="onChange($event, selection)" >
<option *ngFor="#option of options">{{option}}</option>
</select>
{{selection}}
`
})
export class MyDropdown {
@Input() options;
selection = 'Dog';
ngOnInit() {
console.log('These were the options passed in: ' + this.options);
}
onChange(event) {
if (this.selection === event) return;
this.selection = event;
console.log(this.selection);
}
}
Как мы видим, если мы выберем другое значение из раскрывающегося списка, наши ngModel
изменения и интерполированное выражение в представлении это отражают.
Как я могу получить уведомление об этом изменении в моем классе / контроллере?
javascript
angular
люкс
источник
источник
Ответы:
Обновление :
Разделите привязки событий и свойств:
Вы также можете использовать
и тогда вам не нужно будет обновлять модель в обработчике событий, но я считаю, что это приводит к срабатыванию двух событий, поэтому это, вероятно, менее эффективно.
Старый ответ, до того, как они исправили ошибку в beta.1:
Создайте локальную переменную шаблона и прикрепите
(change)
событие:plunker
См. Также Как я могу получить новое выделение в «select» в Angular 2?
источник
ngModel
если я просто привязываю новую переменную с именемitem
? Разве неngModel
стоит заключать в круглые скобки для получения слушателей событий, так зачем же мы вводим новую переменную?selectedItem
- это наши связанные данные, которые NgModel обновляет автоматически для нас, но ... он не уведомляет нас об изменениях, что часто бывает достаточно хорошо (представления и тому подобное будут обновляться), но, очевидно, этого недостаточно для вашего варианта использования. В другом вопросе SO, на который я ссылался, я описываю, как я пытался использовать его(ngModelChange)
для получения уведомлений об изменениях, но он вызывается дважды для каждого изменения. Не знаю, ошибка это или нет. В любом случае, добавление(change)
привязки к событию решает проблему.selectedItem
он не обновляется приonChange()
срабатывании, поэтому, похоже, нам нужна эта локальная переменная шаблона.#
или#item
в нашем случае - это местная ссылка. Вот почему мы можемitem.change
там работать .ngModelChange
настраиваемому событию. Проблема в том, что<select>
это событие запускается дважды при каждом изменении.Я наткнулся на этот вопрос и отправлю свой ответ, который я использовал и работал довольно хорошо. У меня было поле поиска с фильтрами и массивом объектов, а в поле поиска я использовал
(ngModelChange)="onChange($event)"
в моем
.html
тогда в моем
component.ts
источник
ngModelChange
,$event
не DOM Event . Скорее, это текущее значение элемента формы, которое является строкой для элемента ввода.