2017-01-20 3 views
1

유효성 검증에 사용하는 양식의 등록 취소 변경 사항에 문제점이 있습니다. 정확한 방법으로 끄고 싶은 내 방법 :Angular2 unsubscribe valueChanges on formGroup

this.taskForm.valueChanges.subscribe(data => { 
         ... 
       this.output = data; 
     }); 

제출 후이 청취자를 삭제하고 싶습니다. 어떻게해야합니까? unsubscribe을 사용하려고했지만 도움이되지 않습니다. 다음은 내 시도입니다 :

this.sub = this.taskCreate.valueChanges.subscribe(data => { 
          ... 
       this.output = data; 
     }); 

나는 this.sub.unsubscribe();을 추가하려고하지만, 도움이되지 않았다.

onSubmit(form: FormGroup) { 
    let context: number = 0; 

    if(form.valid) { 
     this.appService.addTask(form.value) 
      .then(result => { 
       this.lgModal.hide(); 
       this.taskCreate.reset({ priority: '' }); 
       this.cartBox.cart = []; 
       this.cartBox.showCart = false; 
       this.createTaskDone.emit(); 
       this.attachments.attachmentList = []; 
       this.uploader.clearQueue(); 
       this.reloadContent.emit(context); 
       this.counter += 1; 
       console.log("COUNTER: ", this.counter); 

      })} 
    else { 
     this.formValidator(form); 

    } 

} 

formValidator(form:FormGroup) { 
    if(!form.controls['goal'].valid) this.formValid.goalErr = 1; else this.formValid.goalErr = 0; 
    if(!form.controls['priority'].valid) this.formValid.priorityErr = 1; else this.formValid.priorityErr = 0; 
    if(!form.controls['note'].valid) this.formValid.noteErr = 1; else this.formValid.noteErr = 0; 

    this.taskCreate.valueChanges.subscribe(data => { 
     this.formValidator(form); 
     this.output = data; 
    }); 
} 
+2

문제는 다른 곳에서 발생해야합니다. 'unsubscribe()'는 이런 방식으로 작동합니다. 당신이 제기 한 코드 주위에 더 많은 컨텍스트를 제공 할 수 있습니까? 이 코드는 어디에서 어떻게 호출됩니까? –

+0

안녕하세요 건터! 설명에 더 많은 정보가 추가되었습니다. 정확하게 사용자가 유효하지 않은 양식을 제출할 때 Validator를 호출합니다. 이 Validator는 모든 양식 필드를보고 변경 사항을 감지하는 valueChanges subscribent를 실행하며, field가 유효하지 않은 경우 유효성 검증 정보가있는 레이블을 표시합니다. 처음 실행하면 괜찮습니다.하지만 다음 양식을 보내려면 힘들 것입니다. 이 경우 valueChanges는 사용자가 잘못된 양식을 보내려는 경우가 아니라 양식이 열리기 때문에 작동합니다. –

+0

그 코드에는 아무 것도 없습니다 : 1. "구독 취소"를 시도한 곳; 또는 2. 정확하게 "* 도움이되지 않습니다"*라는 의미입니다. – jonrsharpe

답변

3

formValidator 내부 valueChanges 구독은

formValidator(form:FormGroup) { 
    if(!form.controls['goal'].valid) this.formValid.goalErr = 1; else this.formValid.goalErr = 0; 
    if(!form.controls['priority'].valid) this.formValid.priorityErr = 1; else this.formValid.priorityErr = 0; 
    if(!form.controls['note'].valid) this.formValid.noteErr = 1; else this.formValid.noteErr = 0; 

    this.taskCreate.valueChanges.subscribe(data => { 
     this.formValidator(form); 
     this.output = data; 
    }); 
} 

나는 당신이 실제로 원하는 것은 바로 다음 this.taskCreate 및 초기화 코드 아래

this.sub = this.taskCreate.valueChanges.subscribe(data => { 
    this.formValidator(form); 
    this.output = data; 
}); 

을 이동하는 것입니다 가정 거라고 나에게 잘못된 것 같습니다 onSubmit에서 this.sub.unsubscribe() 전화를하십시오.

this.taskCreate.valueChanges.subscribe(이 여러 번 호출되고, this.sub = this.taskCreate.valueChanges.subscribe(을 사용하면 이전 구독이 새로운 구독으로 덮어 쓰여지고 참조가 손실되므로 구독을 취소 할 수 없습니다.

+0

좋아, 내가 코드를 재건했다, 당신이 바로이 코드는 sux했다,하지만 이것은 dev 단계에서 매우 오래된 애플 리케이션, 그리고 지금은 그것을 지우고 새로운 기능을 추가합니다. unsubscribe()를 통해 비활성화 할 수있는 일부 변수에서 올바른 값 changes를 만들려면 적절한 방법은 무엇입니까? [form] = "taskForm"인 경우. 지금 내가 선언 할 때 내가 묻기 때문에 묻고있다. this.sub = this.taskCreate.valueChanges.subscribe (... 나는 unsubscribe() 메소드에 액세스 할 수 없었다 :(이 밑에) –

+0

알아두면 좋은 곳이 무엇인지 알기가 어렵다. 앞에서 언급했듯이이 코드는'this.taskCreate'를 초기화하는 코드 바로 다음에 넣을 것입니다. –

+1

좋아, 내가 말한 것처럼 내가 떠난 생성자에서 수행했습니다 this.sub = this.taskCreate.valueChanges .subscribe (데이터 => { this.formValidator (this.taskCreate) this.output = 데이터; }) 형태로 오픈 방식에 난)을 this.sub.unsubscribe (첨가 한 후 검사기 인 경우 제출 나는 다시 sub라고 부른다 :) 다시 한번 감사드립니다! –

관련 문제