각도에서 (change) vs (ngModelChange)


326

각도 1은 onchange()이벤트를 허용하지 않으며 이벤트 만 허용 ng-change()합니다.

반면에 Angular 2는 모두 같은 일을하는 것처럼 보이는 이벤트 (change)(ngModelChange)이벤트를 모두 허용합니다 .

차이점이 뭐야?

어느 것이 성능에 가장 좋습니까?

ngModelChange :

<input type="text" pInputText class="ui-widget ui-text"
    (ngModelChange)="clearFilter()" placeholder="Find"/>

vs 변경 :

<input type="text" pInputText class="ui-widget ui-text" 
    (change)="clearFilter()" placeholder="Find"/>

2
나는 그것들을 비교하고 싶지 않습니다. 성능에 가장 적합한 것을 알고 싶습니까?
Ramesh Rajendran 2016 년

6
예, 비교가 없습니다. ngModel을 사용하는 경우 나중에 다른 것을 사용할 수 있습니다. ngModel은 양방향 데이터 바인딩이므로 항상 ngModel을 사용하지 않는 것이 좋습니다. 따라서 성능이 저하됩니다.
Vamshi

2
"차이가 무엇입니까"와 "더 성능이 우수한"에 중점을 두어 주관성을 제거하고 다시 열기로 투표하도록 편집했습니다.
ruffin

12
Angular 7에서 (ngModelChange) = "eventHandler ()"는 [(ngModel)] = "value"에 바인딩 된 값이 변경되기 전에 실행되며 (change) = "eventHandler ()"는 바인딩 된 값 후에 실행됩니다. [(ngModel)] = "value"가 변경되었습니다.
CAK2

4
그런데 (change) 이벤트는 포커스가 입력을 벗어날 때만 발생합니다. 키를 누를 때마다 이벤트가 발생하도록하려면 (입력) 이벤트를 사용할 수 있습니다.
John Gilmer '11

답변:


496

(change) 클래식 입력 변경 이벤트에 바인딩 된 이벤트입니다.

https://developer.mozilla.org/en-US/docs/Web/Events/change

입력에 모델이없는 경우에도 (변경) 이벤트를 사용할 수 있습니다

<input (change)="somethingChanged()">

(ngModelChange)는 IS @OutputngModel 지시어가. 모델이 변경되면 시작됩니다. ngModel 지시문이 없으면이 이벤트를 사용할 수 없습니다.

https://github.com/angular/angular/blob/master/packages/forms/src/directives/ng_model.ts#L124

소스 코드에서 더 많은 것을 발견 (ngModelChange)하면 새로운 값을 내 보냅니다.

https://github.com/angular/angular/blob/master/packages/forms/src/directives/ng_model.ts#L169

따라서 다음과 같은 사용 능력이 있음을 의미합니다.

<input (ngModelChange)="modelChanged($event)">
modelChanged(newObj) {
    // do something with new value
}

기본적으로, 둘 사이에는 큰 차이가없는 것처럼 보이지만 ngModel이벤트를 사용할 때 이벤트가 힘을 얻습니다 [ngValue].

  <select [(ngModel)]="data" (ngModelChange)="dataChanged($event)" name="data">
      <option *ngFor="let currentData of allData" [ngValue]="currentData">
          {{data.name}}
      </option>
  </select>
dataChanged(newObj) {
    // here comes the object as parameter
}

" ngModel것" 없이 같은 것을 시도한다고 가정

<select (change)="changed($event)">
    <option *ngFor="let currentData of allData" [value]="currentData.id">
        {{data.name}}
    </option>
</select>
changed(e){
    // event comes as parameter, you'll have to find selectedData manually
    // by using e.target.data
}

1
ngmodel 객체와 함께 change 이벤트를 사용하면 어떻게됩니까?
Ramesh Rajendran

6
@RameshRajendran 나는 대답을 향상시켰다. ngModel 객체와 함께 change 이벤트를 계속 사용할 수 있지만 change 이벤트는 이벤트 매개 변수를 전달하고 ngModelChange 이벤트는 새로운 값을 전달합니다.
omeralper

1
그래 +1 그러나 ctr + A를 사용하여 텍스트 상자에서 모든 값을 지우면 ngmodelchange에 문제가 있습니다. 그러면 ngModelChange가 트리거되지 않습니다.
Ramesh Rajendran

6
<input (ngModelChange)="modelChanged($event)">[ngModel]필요 하지 않습니다 .
e- 클라우드

3
뭔가, 당신은 할 수 없습니다 (change),이 경우, 당신은 할 수 있습니다(onClick)="yourFunction(youParameter)"
jpmottin

83

각도 7에서는이 (ngModelChange)="eventHandler()"실행됩니다 전에 바인딩 값이 [(ngModel)]="value"그동안 변화 (change)="eventHandler()"의지 화재 이후 에 바인딩 값이 [(ngModel)]="value"변경됩니다.


1
방금 Angular 7.1에서 테스트했으며 ngModel의 값이 이벤트가 호출되기 전에 업데이트됩니다. 그래서 그것이 제가 사용하는 것
Jahrenski

각도 6에서도 작동했습니다. : 내 시간을 절약 한
Hemadri Dasari

1
다른 방법이 아닙니까? Angular Docs 에 따르면 ngModelChange뷰 모델이 업데이트 된 후에 발생합니다.
분노

3
각도의 최신 문서에서이 경우를 설명 : angular.io/guide/...
pioro90

4
Angular 7.2에서는 실제로 값이 변경 되기 전과 변경된 후에(ngModelChange) 이벤트가 발생 합니다 . 정보 주셔서 감사합니다, 매우 도움이! (change)
Dennis Ameling

15

내가 다른 주제를 발견하고 썼 듯이 -이것은 각도 <7에 적용됩니다 (7+의 상태가 확실하지 않음)

미래를 위해서만

우리 [(ngModel)]="hero.name"는 다음과 같이 설탕을 제거 할 수있는 지름길이라는 것을 알아야 [ngModel]="hero.name" (ngModelChange)="hero.name = $event"합니다.

따라서 코드의 설탕을 제거하면 다음과 같이 끝납니다.

<select (ngModelChange)="onModelChange()" [ngModel]="hero.name" (ngModelChange)="hero.name = $event">

또는

<[ngModel]="hero.name" (ngModelChange)="hero.name = $event" select (ngModelChange)="onModelChange()">

위의 코드를 살펴보면 2 개의 ngModelChange이벤트가 발생하고 순서대로 실행해야합니다.

요약 : 전에 배치 하면 새 값으로 얻을 수 있지만 모델 객체는 여전히 이전 값을 유지합니다. ngModelChangengModel$event 뒤에 배치 ngModel하면 모델에 이미 새 값이 적용됩니다.

출처


이것을 지적 해 주셔서 감사합니다! 당신의 설명을 찾을 때까지이 문제가있었습니다
omostan

2

1- (change) HTML onchange 이벤트에 바인딩됩니다. HTML onchange에 대한 설명서는 다음과 같습니다.

사용자가 <select>요소 의 선택된 옵션을 변경할 때 JavaScript를 실행합니다

출처 : https://www.w3schools.com/jsref/event_onchange.asp

2- 앞에서 언급했듯이 (ngModelChange)입력에 바인딩 된 모델 변수에 바인딩됩니다.

그래서 내 해석은 다음과 같습니다.

  • (change)사용자 가 입력을 변경하면 트리거됩니다.
  • (ngModelChange) 모델이 사용자 작업에 연속적이든 아니든 모델이 변경 될 때 트리거됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.