【问题标题】:How to bind to more than 1 ReactFX observable?如何绑定到超过 1 个 ReactFX observable?
【发布时间】:2017-06-24 23:45:13
【问题描述】:

在常规 JavaFX 中,我会像这样在 2 个或多个 observables 上创建一个绑定:

xxxProperty().bind(Bindings.createObjectBinding(() -> {...}, observable1, observable2, ...));

在 ReactFx 中,我被证明可以创建这样的绑定:

xxxProperty().bind(val.map(value -> {...}));

但是如何在 2 个或更多 ReactFX 可观察对象(Val 和/或 Var)上创建绑定?

【问题讨论】:

    标签: java javafx binding reactfx


    【解决方案1】:

    对于一般情况,使用以下之一:

    static <T> Val<T> create(Supplier<? extends T> computeValue, EventStream<?> invalidations)
    static <T> Val<T> create(Supplier<? extends T> computeValue, Observable... dependencies)
    

    对于组合 2-6 个值,提供了方便的方法:

    static <A,B,R> Val<R> combine(ObservableValue<A> src1, ObservableValue<B> src2, BiFunction<? super A,? super B,? extends R> f)
    static <A,B,C,R> Val<R> combine(ObservableValue<A> src1, ObservableValue<B> src2, ObservableValue<C> src3, TriFunction<? super A,? super B,? super C,? extends R> f)
    static <A,B,C,D,R> Val<R> combine(ObservableValue<A> src1, ObservableValue<B> src2, ObservableValue<C> src3, ObservableValue<D> src4, TetraFunction<? super A,? super B,? super C,? super D,? extends R> f)
    static <A,B,C,D,E,R> Val<R> combine(ObservableValue<A> src1, ObservableValue<B> src2, ObservableValue<C> src3, ObservableValue<D> src4, ObservableValue<E> src5, PentaFunction<? super A,? super B,? super C,? super D,? super E,? extends R> f)
    static <A,B,C,D,E,F,R> Val<R> combine(ObservableValue<A> src1, ObservableValue<B> src2, ObservableValue<C> src3, ObservableValue<D> src4, ObservableValue<E> src5, ObservableValue<F> src6, HexaFunction<? super A,? super B,? super C,? super D,? super E,? super F,? extends R> f)
    

    所有这些都是Val 上的静态方法。

    【讨论】:

    • 非常好!如果我想为Var 做类似的事情,我只需执行上述操作,然后从生成的 Val 创建一个 Var?还要让我亲自感谢您对 ReacFX 的支持。它似乎为我解决了很多问题。我唯一的抱怨是缺少 javadoc 或好的教程。这是一个高级库(我会说),所以会有很大帮助。
    • 取决于您所说的“与Var 类似的东西”是什么意思。当您使用函数f 来自多个Vars 的map 或combine 值时,通常f 是不可逆的,因此(通常)没有明确定义应该对输入@987654333 执行什么操作@s 当您在输出 Var 上调用 setValue 时。如果在您的情况下它是明确定义的,则使用Val#asVar 来执行此操作(即更改输入,因此输出将更改为所需的值)。
    • 或者您可能只是希望能够手动覆盖计算值。在这种情况下,只需创建一个新的Var 并根据组合的Val 进行更新,也可以手动更新。很高兴你喜欢 ReactFX。是的,文档是一场永恒的斗争......
    • 是的 Val.asVar 就是我的意思。没有考虑可逆性。你有这个项目的合作者吗?也许让人们帮助文档。
    • 小心combine。如果任何值是null,则其上的侦听器将永远不会触发。任何可以是null 的值都必须用val.orElseConst(x) 包装...这是一个已经让我抓到好几次的陷阱。
    猜你喜欢
    • 2017-05-25
    • 2018-04-07
    • 1970-01-01
    • 2013-04-25
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多