単純なログインページであろうと複雑な注文送信ページであろうと、フォームのフロントエンド検証(ログイン名前やパスワードがログインボタンを照らすことができる前の基本要件を満たすなど)は不可欠なステップです。この記事では、フォームの提出前にRXJavaを使用して検証の問題を簡単に処理する方法を示しています。この例では、Androidで簡単なログインページを使用しています。
コンテンツの概要
従来の検証方法
CombinElatestオペレーター
CombinElatestを使用して、フォーム検証を処理します
combineLatestとzipの違い
この記事に示されているサンプルコードはrxandroiddemoにあります。LoginActivityファイルを参照してください
従来の検証方法
ここでは、上記の図に示すように、電子メール入力とパスワード入力を説明するために、最も単純な例を使用して、以下はログインボタンです。下のボタンは、電子メール入力ボックスのコンテンツに @文字が含まれており、パスワード入力ボックスのコンテンツが4を超える場合にのみ照らされます。
まず、EdittextまたはEdittextから継承する場合、一般的に言えば、AddTextChangedListenerを使用してコンテンツを聞きます。ただし、ログインボタンの有効化が電子メールとパスワードで同時に決定する必要があることは明らかです。どちらも明るいことしかできません。したがって、電子メールのTextWatcherでは、電子メールが条件を満たしているかどうかを判断するだけでなく、パスワードが同時に条件を満たしているかどうかを判断する必要があります。
注文フォームを送信している場合、1ダース以上の入力ボックスが付いている場合、各入力コンテンツが同時に条件を満たしている場合、「送信」ボタンを点灯できます。それがどれほど痛いのか - 入力ボックスのすべての変更を使用して、他のダースの入力ボックスのコンテンツが同じものを満たしているかどうかを判断する必要があります(実際、この時点で他のダースの入力ボックスは変更されていません)
CombinElatestオペレーター
CombinElatestは、RXJava自体が提供する一般的な演算子であり、2つ以上の観測可能性とFUNCX閉鎖を受け入れます。着信した観測可能性のいずれかがデータを送信する場合、各観測可能な値(最新)を組み合わせて、処理のためにFUNCXクロージャーに渡します。ポイントはです
1.CombinElatestは、各観測可能な最新の値を保存します
2。観察可能なものは新しい値を放出し、操作をトリガーします - >「観測可能なすべての最後の値を一緒に組み合わせて、機能に送信します」
CombinElatestを使用して、フォーム検証を処理します
まず、電子メールとパスワードの確認方法を書きます。 1つは @文字を含める必要があり、もう1つは4文字以上が必要です。
private boolean isemailvalid(string email){// todo:これを独自のロジックreturn email.contains( "@"); } private boolean ispasswordvalid(string password){// todo:これを独自のロジックreturn password.length()> 4;}に置き換えます次に、それぞれ電子メールとパスワードの観測可能性を作成します。排出された値は、各編集の変更のコンテンツです。コールコールバックメソッドの返品値は、TextWatcherのAfterTextChangedメソッドの着信パラメーターです。
Observable <String> ObservableMail = Observable.create(new Observable.Onsubscribe <String>(){@Override public void Call(final subscriber <?super string> subscriber){memailview.addtextchangedlistener(new TextWatcher(){@Override public beid beid befortextchanged( } @Override boid ontextChanged(charsequence s、int start、int count){} @override void avtertextChanged {subscriber.onext(S.ToString())}); Observable <string> ObservablePassword = Observable.create(new Observable.Onsubscribe <String>(){@Override Public void Call(final Subscriber <?super String> subscriber){mpasswordview.addtextchangedlistener(new textwatcher(){@override public beidbeforetext( {} @Override public void ontextChanged(charsequence s、int start、int count){} public void abtextChanged {subscriber.onext(s.toString()}});最後に、CombinElastestを使用して、ObservableMailとObservablePassWordを組み合わせて確認してください。
Observable.comBinelatest(ObservableMail、ObservablePassword、new Func2 <String、String、Boolean>(){@Override Public Boolean Call(String Email、String Password){return iSemailvalid(Email)&& isPassWordValid(パスワード);}})。 } @Override boid onerror(throwable e){} @override public void onnext(boolean verify){memailsigninbutton.setEnabled(true)}onnextで確認することは、Lastestを組み合わせた後に2つを組み合わせた結果です。
loginActivityのbindview()メソッドを参照してください
ここでは、フォームが非常に複雑であっても、必要に応じて実際に拡張するのは簡単です。
1。各編集の観察可能をカプセル化します
2。この文を書き直して、新しいロジックを追加します。
return isemailvalid(email)&& ispasswordvalid(password);
編集ごとに観察可能なものをカプセル化するには、多くの重複コードが必要だと思いますか?心配しないでください、ジェイク・ウォートンは長い間、rxbindingのrxtextViewがこの問題を解決できると考えていました。
Observable <Charsequence> ObservableMail = rxtextView.TextChanges(Memailview); Observable <CharSequence> ObservablePassWord = rxtextView.TextChanges(mPassWordView); Boolean Call(CharSequence Email、CharSequence Password){return isemailvalid(email.tostring())&& ispasswordvalid(password.tostring())。 void onnext(boolean verify){if(verify){memailsignbutton.setEnabled(true);loginActivityのbindviewbyrxbinding()メソッドを参照してください
combineLatestとzipの違い
ZIPは、CombinElatestに多少似たオペレーターであり、受け入れるパラメーターは2つ以上の観測可能性と閉鎖です。しかし、違いは次のとおりです。
1.ZIPは、観測可能な各データを厳密に組み合わせて結合します。これは、観察の最初のデータと観測可能なデータを組み合わせてFUNCXに送信し、2つのn番目のデータを組み合わせて処理のためにFUNCXに送信します。
2.ZIPは、観察可能なデータがデータを送信する場合、閉鎖処理をトリガーしませんが、トリガーする前に観察可能な各データが完全に送信されるのを待ちます。
ZIPは通常、複数の関係者が順番に配置したデータを統合するために使用されます。
上記は、編集者によって導入された複雑なフォーム検証問題を扱うRXJAVAの方法の簡単な分析です。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!