2017-08-23 4 views
0

サービスがInfoFormServiceと呼ばれ、isInValidatingという変数があります。サービス変数の状態がコンポーネントAngular4で変更された場合にのみ関数を実行する方法

コンポーネントがvalidateEmail(email)関数を呼び出すときの変数は、次のようにtrueに設定されます。

@Injectable() 
export class InfoFormService { 

    private VALIDATE_EMAIL_URL: string = 'XXX'; 
    isInValidating: boolean = false; 

    constructor(@Inject(APP_CONFIG) private config: AppConfig, 
       private http:Http 
    ) { 

     console.log(this.config.apiEndpoint) 

    } 

    validateEmail(email) { 
     console.log(email) 
     this.isInValidating = true; 
     return this.http.get(`${this.config.apiEndpoint}/${this.VALIDATE_EMAIL_URL}${email}`) 
    } 

} 

コンポーネントは、電子メール入力テキストが変更されたときにvalidateEmailを呼び出します。

送信ボタンをクリックすると、ValidateEmailに時間がかかるため、isInValidating値はtrueまたはfalseですが、ValidateEmailアクションが完了すると、isInValidating値は上記のコードと同様にfalseに設定されます。

私が望むのは、サービスのisInValidating値がtrueに設定されるまで[送信]ボタンをクリックしたときに送信アクションを遅らせることです。

export class AbcBtnComponent implements OnInit { 

    constructor(private formService:InfoFormService) { 

    } 

    ... 

    emailField.valueChanges 
     .filter(val => { 
     return val.length >= 1; 
     }) 
     .debounceTime(100) 
     .switchMap(val => this.formService.validateEmail(val)) 
     .subscribe(res => { 

     console.log(res) 
     let validation = res.json(); 

     if (validation['valid']) { 
      emailField.setErrors(null); 
     } else { 
      emailField.setErrors({ validEmail: true }); 
     } 

     this.formService.isInValidating = false; 

     }); 

    onSubmit(value) { 
     // Here I want to delay until formService's isInValidating value = true 

     submitAction(value) 
    } 

} 

私はSubjectまたはObservableを使用する必要がありますが、使用方法はわかりません。

私を助けてください!

+0

を理由だけで保管しないでisInValidatingがfalseに設定されるまでコンポーネントの値を一時的にサブミットし、次にそれを設定する行の直後にfalseにすると、実際にキャッシュされたデータを送信する別のメソッドに呼び出しを追加しますか? – diopside

+0

いつでもisInValidatingがfalseになった直後にデータを送信するようですが、Submitボタンをクリックするとデータを送信したいと思っています。 そして、isInValidatingがfalseに変更されたことを検出する方法は、単なる問題であり、この質問の目標です。 – BigDaddy

+0

私はその質問を誤解しました、ごめんなさい。 'isInValidating'をtrueに設定するのは何ですか?私はコード内で真実に設定するものは見当たらず、偽に設定するものだけがあります。フォームサービスは裏でそれをしますか?もしそうなら、あなたはそれを購読し、変更を見てフォームを提出することができるはずですが、その方法でも送信準備が整うまで提出をキャッシングする方が良いでしょう。 – diopside

答えて

1

コンポーネントで

get isInValidating(): boolean { 
    return this.formService.isInValidating; 
} 
テンプレートで

<button type="submit" [disabled]="isInValidating">Submit</button> 
0

技術的には、validateEmail呼び出しを購読してそこでコードを実行すると機能するはずです。しかし、私はあなたの質問を忘れてしまったかもしれません。

あなたはまた、単にisInValidatingを削除するなどの内側をonSubmit(値)を持つことができます:

this.formService.validateEmail(val)).subscribe(res => { 
//logic to check your validation 
if(valid) this.onSubmit(val) 
}); 
関連する問題