उत्सर्जित कर रहा है मैं अपने प्रतिक्रियाशील प्रोग्रामिंग कौशल को कोशिश करने और बोल्ड करने के लिए एक साधारण लॉगिन फ़ॉर्म (ईमेल और पासवर्ड) बना रहा हूं। मुझे जिस तरह से मैं चाहता हूं काम करने के लिए ईमेल फ़ील्ड सत्यापन प्राप्त करने में कुछ परेशानी हो रही है।ईमेल लॉगिन सत्यापन के लिए आरएक्सजेवा का उपयोग करके, एक अवलोकन योग्य दो बार
यहाँ मेरी कोड है:
final Observable<CharSequence> email = RxTextView.textChanges(emailView);
Observable<Boolean> emailIsValid = email.map(new Func1<CharSequence, Boolean>() {
@Override
public Boolean call(CharSequence charSequence) {
Log.d("asdf", "emailIsValid call: " + charSequence);
return Pattern.matches(Patterns.EMAIL_ADDRESS.pattern(), charSequence);
}
});
RxView.focusChanges(emailView)
.withLatestFrom(emailIsValid, new Func2<Boolean, Boolean, Boolean>() {
@Override
public Boolean call(Boolean hasFocus, Boolean emailIsValid) {
return (!hasFocus && !emailIsValid);
}
})
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean showError) {
if (showError) {
emailInputLayout.setError("Enter a valid email");
} else {
emailInputLayout.setError(null);
}
}
});
Observable<CharSequence> password = RxTextView.textChanges(passwordView);
Observable.combineLatest(emailIsValid, password,
new Func2<Boolean, CharSequence, Boolean>() {
@Override
public Boolean call(Boolean emailIsValid, CharSequence password) {
Log.d("asdf", "valid: " + emailIsValid + ", password: " + password);
return (emailIsValid && password.length() > 0);
}
})
.subscribe(RxView.enabled(loginButton));
और यहाँ लॉग है:
emailIsValid call: emailIsValid call: valid: false, password: // I type 'j' emailIsValid call: j emailIsValid call: j valid: false, password: // I type 'a' emailIsValid call: ja emailIsValid call: ja valid: false, password:
आप देख सकते हैं, emailIsValid
दो बार हर बार जब मैं एक चरित्र टाइप कहा जाता है, यह एक कर रहा है, जिसका मतलब है रेगेक्स मैच दो बार, जो अपमानजनक है।
मैंने देखा कि मैं emailIsValid
केवल एक बार प्रति परिवर्तन कह सकता हूं, चाहे कितने ग्राहक हैं, और मुझे share()
विधि मिली। यहाँ जब मैं emailIsValid
की घोषणा के अंत तक .share()
जोड़ने क्या होता है:
emailIsValid call: // I type 'j' emailIsValid call: j valid: false, password: // I type 'a' emailIsValid call: ja valid: false, password:
कि समस्या का हल है, लेकिन यह एक और कारण बनता है: कोई प्रारंभिक emailIsValid
द्वारा अंत में combineLatest
कार्य करने के लिए फेंकना है, इसलिए लॉगिन बटन सक्षम होना शुरू होता है, जब इसे अक्षम किया जाना चाहिए (ग्रेड आउट)।
इसे हल करने का सबसे साफ तरीका क्या है? मैं सोचता हूं मैं इसे BehaviorSubject
की तरह व्यवहार करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि यह करने का सबसे अच्छा तरीका है या नहीं।
बहुत बढ़िया, कनेक्ट करने योग्य अवलोकनों से अवगत नहीं था। अच्छा काम करता है, धन्यवाद! –
@ D_Steve595 एनपी। खुशी है मैं मदद कर सकता हूँ! – pt2121