У меня есть форма с 14 полями, которые должны быть действительными, прежде чем кнопка отправки будет включена.
У меня есть наблюдаемое в каждом из полей, и я использую combLatest(), чтобы убедиться, что все они действительны одновременно.
Я попробовал его с меньшим количеством аргументов, и он работает хорошо (когда я использую Func3, Func4 и т. д.).
Проблема с combLatest() заключается в том, что когда вы объединяете более 9 наблюдаемых, вы должны использовать FuncN в качестве наблюдаемого объединения. Вот пример кода:
List <Observable<Boolean>> fieldObservables = new ArrayList<Observable<Boolean>>();
fieldObservables.add(field1Observable);
fieldObservables.add(field2Observable);
fieldObservables.add(field3Observable);
fieldObservables.add(field4Observable);
fieldObservables.add(field5Observable);
fieldObservables.add(field6Observable);
fieldObservables.add(field7Observable);
fieldObservables.add(field8Observable);
fieldObservables.add(field9Observable);
fieldObservables.add(field10Observable);
fieldObservables.add(field11Observable);
fieldObservables.add(field12Observable);
fieldObservables.add(field13Observable);
fieldObservables.add(field14Observable);
Subscription formReadySubscription = Observable
.combineLatest(fieldObservables,
new FuncN<Boolean>() {
@Override
public Boolean call(Boolean... readyArgs) {
for (Boolean ready : readyArgs) {
if (!ready) {
return false;
}
}
return true;
}
})
.subscribe(new Observer<Boolean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Boolean formValid) {
// TODO: enable submit button
}
});
Приведенный выше код дает две ошибки в FuncN:
"Anonymous is not abstract and does not override abstract method call(Object...) in FuncN"
и "Method does not override or implement a method from a supertype"
для метода call().
Похоже, что метод call() FuncN<Boolean>
ожидает список Object, а не Boolean. (Мне интересно, является ли это ошибкой. Я подозреваю, что Func2 (в качестве примера) определяется как Func2<Boolean, Boolean, Boolean>
, где два логических значения являются параметрами, а одно из логических значений является ожидаемым возвратом от метода call() , Сохраняя этот шаблон, вы ожидаете, что объявление FuncN будет FuncN<Boolean,Boolean>
.)
Кто-нибудь успешно заставил FuncN работать, и если да, то как вы это сделали? Спасибо!
public Boolean call(Boolean... readyArgs) {
наpublic Boolean call(Object... readyArgs) {
, а затем привести параметры к логическим значениям внутри метода? - person GreyBeardedGeek   schedule 10.11.2015FuncN
довольно уродлив и не имеет общего параметра. Он принимает толькоR call(Object... args)
, что отстой, так как вы должны разыгрывать их потом. - person njzk2   schedule 17.11.2015