我正在关注this code进行错误验证。这是combineLatest实现,它接受来自3个字段的输入并对每个字段进行错误验证。
Flowable.combineLatest(
_emailChangeObservable,
_passwordChangeObservable,
_numberChangeObservable,
(newEmail, newPassword, newNumber) -> {
boolean emailValid = !isEmpty(newEmail) && EMAIL_ADDRESS.matcher(newEmail).matches();
if (!emailValid) {
_email.setError("Invalid Email!");
}
boolean passValid = !isEmpty(newPassword) && newPassword.length() > 8;
if (!passValid) {
_password.setError("Invalid Password!");
}
boolean numValid = !isEmpty(newNumber);
if (numValid) {
int num = Integer.parseInt(newNumber.toString());
numValid = num > 0 && num <= 100;
}
if (!numValid) {
_number.setError("Invalid Number!");
}
return emailValid && passValid && numValid;
})
.subscribe(_disposableObserver);
我的问题是除非所有3个输入字段可观察量至少发出一次,否则不会触发组合器功能。因此,当用户输入错误的电子邮件地址时,他们不会得到通知,直到他们在所有3个字段中输入了一些数据。
答案 0 :(得分:2)
combineLatest()
必须具有开始发射内容的所有值,因为根据定义,组合器函数获得从n个源发出的n个值。
当RxBInding用TextView
包装RxTextView
个事件时,它会在订阅时发出初始值(TextView
的内容),因此如果没有skip(1)
,您将获得理想的逻辑,就是这个样本中的验证逻辑不要指望,并且显示空值的错误(通过!isEmpty(newXXX)
检查)。
基于显式skip(1)
转换的我的预感是,在这个例子中,这是期望的行为 - 意味着只要输入了所有字段,我们就需要显示错误。
在你的情况下,如果你想实现你的逻辑,你需要跳过显示错误的空值,同时仍然在最后发出false
,因为整个输入尚未生效,然后 - 任何改变字段独立于其他字段,而不是空的,你会错误。