선택 태그에서 ngModel 변경 감지 (Angular 2)


97

나는에 변화를 감지하려고 시도하고 ngModelA의 <select>태그입니다. 각도 1.x에서, 우리는 함께이 문제를 해결 수 $watchngModel, 또는 사용하여 ngChange,하지만 난에 변화를 감지하는 방법을 이해 아직했습니다 ngModel코너 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 dec

답변:


235

업데이트 :

이벤트 및 속성 바인딩을 분리합니다.

<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

참조 내가 각도 2에서 "선택"의 새로운 선택을받을 수 있습니까?


1
그래서 ngModel내가라는 새 변수를 바인딩하는 경우 의 요점은 무엇 item입니까? ngModel이벤트 리스너를 얻기 위해 괄호로 묶는 것이 중요 하지 않은데 왜 새로운 변수를 도입하는 것일까 요?
lux

2
@lux, 네 좋은 질문입니다. selectedItemNgModel이 우리를 위해 자동으로 업데이트하는 바인딩 된 데이터이지만 ... 변경 사항을 알리지 않습니다. 종종 충분합니다 (보기 등이 업데이트 됨). 분명히 이것은 사용 사례에 충분하지 않습니다. 내가 참조한 다른 SO 질문 (ngModelChange)에서 변경 사항 알림을 받기 위해 사용하는 방법을 설명 했지만 각 변경 사항에 대해 두 번 호출됩니다. 그게 버그인지 아닌지는 모르겠습니다. 어쨌든 (change)이벤트 바인딩을 추가 하면 문제가 해결되는 것 같습니다.
Mark Rajcok

또한 화재 selectedItem시 업데이트되지 않는 플 런커를 업데이트 했으므로 onChange()해당 로컬 템플릿 변수가 필요한 것 같습니다.
Mark Rajcok

@lux는 #또는 #item우리의 경우 로컬 참조입니다. 따라서 우리가 item.change그곳에서 할 수있는 이유 입니다.
Mark Pieszak-Trilon.io

@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

@MarkRajcok에 대한 문서를 알려 주시면 나머지 개발 팀과 공유 할 수 있습니까?
Neil S

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.