如何检测在选择标签(角度 2)上对 ngModel 的更改?

2022-08-30 05:01:11

我正在尝试检测标记中的更改。在 Angular 1.x 中,我们可能会使用 on 或 using 来解决这个问题,但我还没有了解如何检测 Angular 2 中的变化。ngModel<select>$watchngModelngChangengModel

完整示例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

如何获得有关类/控制器中此更改的通知?


答案 1

更新

分离事件绑定和属性绑定:

<select [ngModel]="selectedItem" (ngModelChange)="onChange($event)">
onChange(newValue) {
    console.log(newValue);
    this.selectedItem = newValue;  // don't forget to update the model here
    // ... do other stuff here ...
}

您也可以使用

<select [(ngModel)]="selectedItem" (ngModelChange)="onChange($event)">

然后你不必在事件处理程序中更新模型,但我相信这会导致两个事件触发,所以效率可能较低。


在他们修复beta.1中的错误之前,旧答案:

创建局部模板变量并附加事件:(change)

<select [(ngModel)]="selectedItem" #item (change)="onChange(item.value)">

plunker

另请参阅如何在Angular 2的“选择”中获取新选择?


答案 2

我偶然发现了这个问题,我将提交我使用并运行良好的答案。我有一个搜索框,可以过滤对象和数组,在我的搜索框中,我使用了(ngModelChange)="onChange($event)"

在我的.html

<input type="text" [(ngModel)]="searchText" (ngModelChange)="reSearch(newValue)" placeholder="Search">

然后在我的component.ts

reSearch(newValue: string) {
    //this.searchText would equal the new value
    //handle my filtering with the new value
}