2017-01-20 15 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();を追加しようとしましたが、それは助けにはなりませんでした。 formValidator内部valueChangesへの登録

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サブスクライバを実行し、フィールドが無効である場合は、検証情報を持つラベルを表示します。 最初に実行しても問題ありませんが、次のフォームを送信するときには難しいことです。この場合、フォームが開かれているので、ユーザーが無効なフォームを送信したいときではなく、valueChangesが機能します。 –

+0

そのコードのどこにもあなたはどちらかを表示していません:1.あなたは '退会しようとしました。または2.正確に何を意味するのか*は「助けにはならない」*。 – jonrsharpe

答えて

3

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; 
}); 

を移動することですonSubmitthis.sub.unsubscribe()を呼び出します。

this.taskCreate.valueChanges.subscribe(が複数回呼び出され、this.sub = this.taskCreate.valueChanges.subscribe(を使用した場合、以前のサブスクリプションは新しいサブスクリプションによって上書きされ、参照が失われるため、サブスクライブ解除できません。

+0

私はコードを再構築しましたが、このコードはsuxですが、これは開発段階の非常に古いアプリケーションです。今では、これをクリアして新しい機能を追加しています。 私はunsubscribe()で無効にすることができるいくつかの変数の下で適切なvaluechangesサブスクリプションを構築するための適切な方法は何ですか? [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 =データ; });フォームopenメソッドで Iは(this.sub.unsubscribeを添加)、及び検証されたときの後提出私はもう一度呼び出すと呼ばれる:)再びありがとう! –

関連する問題