2017-10-23 2 views
2

How to use RxJs distinctUntilChanged?this을 보면, distinctUntilChanged은 출력 스트림이 개의 연속적인 값만을 제공하는 것으로 보입니다.FormControl.detectchanges - distinctUntilChanged를 사용하는 이유는 무엇입니까?

동일한 값이 연속적으로 연속적으로 도착하면 본질적으로 스트림을 필터링하고 반복되는 값을 한 번만 가져 오는 것을 의미합니다.

그래서 내가 작성하는 경우이 : 나는 폼 입력에 valueChanges에 가입 할 때 몇 군데가 distinctUntilChanged를 사용하는 것이 좋습니다 본 적이

this.myFormControl.valueChanges 
    .debounceTime(1000) 
    .subscribe(newValue => { 
    console.log('debounced: ', newValue); 
    }); 

:이 출력에 차이를 볼

this.myFormControl.valueChanges 
    .debounceTime(1000) 
    .distinctUntilChanged() 
    .subscribe(newValue => { 
    console.log('debounced: ', newValue); 
    }); 

-하지만 실제로 이유는 모르겠다.

입력입니다. 사용자가 입력하는 경우 항상 변경됩니다. 맞습니까? 값은 항상 별개이므로 추가 작업을 이유없이 필터 입력에 추가하는 것입니다.

여기에 뭔가가 있습니까?

편집

내 첫 번째 코드 샘플에 따라 distinctUntilChanged을 사용하여, 나는 값 Mr Trump으로 양식 입력을 생성하고이 모델에 저장된 보장.

그런 다음 컨트롤을 클릭하고 Mr Trump을 붙여 넣었습니다. 값이 같기 때문에 기록 된 내용이 표시되지 않을 것으로 예상 했었습니다. 컨트롤에 이전과 동일한 값이 있으므로 확실하게 distinctUntilChanged에서 무시해야합니다.

2

더 내 테스트에보고 한 후,이 문제는 내가 AbstractControls의 배열을 사용하기 때문에 것으로 보인다 편집 : 조금 이상한하지만

this.itemsControl = <FormArray>this.form.controls['items']; 
... 
this.itemsControl.controls[index].valueChanges... 

그래서 여전히 때 화재 것을을 값이 같으면 배열 항목 자체가 아니라이 배열 항목 (양식 그룹) 내부의 실제 입력에 valueChanges에 연결할 필요가 있다고 추측합니다.

EDIT

그래서 3 (예상) valueChanges 발생하지 않는 이미 입력 제어에 존재하는 동일한 값을 붙여, 이하에 EDIT 2 코드를 변경 한 후.

let fg = this.itemsControl.controls[index]; // get the formGroup 
fg['controls'].content.valueChanges 
    .debounceTime(1000) 
    .distinctUntilChanged() 
    .subscribe(newValue => {...}); 

답변

3

우리가 단지 그 동안, 사용자가 1 초 동안 입력 멈춘 요청을 전송 수단 debounceTime(1000) 사용 : EDIT 2 valueChanges은 (content이라고 본 경우) 전체 formGroup 아닌 개별 입력 제어 꺾어시켰다 두 번째 사용자가 입력 값이 마지막 요청 이후 변경되지 않은, 그래서 3 자 다음, 그것들을 삭제 쓸 수 있지만, 당신은 당신이 사용할 수있는 피하기 위해, 동일한 요청을 보내는 .distinctUntilChanged()

this.myFormControl.valueChanges 
     .debounceTime(1000) 
     .distinctUntilChanged() 
     .subscribe(newValue => { 
     console.log('debounced: ', newValue) 
     }); 
+0

헥타르 아, 가지입니다 명백한 지금 당신은 그것을 밖으로 지적한다, 이렇게 시간을내어 주셔서 감사합니다! :) – rmcsharry

관련 문제