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


97

我试图发现一个变化ngModel<select>标签。在Angular 1.x中,我们可以使用$watchon ngModel或使用来解决此问题ngChange,但我尚未了解如何检测ngModelAngular 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更改以及视图中的插值表达式都会反映出这一点。

我如何在班级/控制器中收到有关此更改的通知?


1
您可能希望保留一些额外的注释;您不希望这个问题被伪装成骚人。 stackoverflow.com/help/dont-ask
Claies 2015年

Answers:


234

更新

分开事件和属性绑定:

<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的“选择”中获得新选择?


1
那么,ngModel如果我只绑定一个名为的新变量,那有item什么意义呢?是不是捆绑的点ngModel括号收购事件侦听器,所以我们为什么要引入一个新的变量?
lux

2
@lux,是个好问题。 selectedItem是我们的绑定数据,NgModel会自动为我们更新数据,但是...它不会通知我们更改,更改通常足够好(视图等会更新),但是显然这对于​​您的用例来说不够好。在我引用的另一个SO问题中,我描述了如何尝试(ngModelChange)用来获取更改通知,但是每次更改都会被调用两次。我不知道那是不是错误。无论如何,添加(change)事件绑定似乎可以解决该问题。
Mark Rajcok

另外,我更新了插件,该插件显示selectedItemonChange()触发时不会更新,因此似乎我们需要该本地模板变量。
Mark Rajcok

@lux的##item在我们的情况是一个本地参考。因此,为什么我们能够在item.change那里做。
Mark Pieszak-Trilon.io 2015年

@lux,我已经描述了挂接方法:绑定到ngModelChange自定义事件。问题在于,对于<select>,此事件每次更改都会触发两次。
Mark Rajcok

12

我偶然发现了这个问题,我将提交我曾经使用过并且效果很好的答案。我有一个过滤了对象数组的搜索框,在搜索框中我使用了(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
}

5
仅供参考,结合的时候ngModelChange$event是不是一个DOM 事件。而是表单元素的当前值,它是输入元素的字符串。
Mark Rajcok '16

@MarkRajcok您可以为我提供有关此文档的信息,以便与其他开发团队分享吗?
尼尔S

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.