【发布时间】:2023-05-09 08:50:01
【问题描述】:
在 Vaadin 8 Framework 和 Vaadin 10 Flow 中,数据绑定功能允许我们提供 Converter 来在小部件的预期数据类型(例如 String 用于 TextField)和支持 bean 属性(例如 Integer 数字)。
在这个例子中,使用了内置的Converter实现StringToIntegerConverter。
binder
.forField( this.phaseField )
.withConverter(
new StringToIntegerConverter( "Must enter an integer number" )
)
.bind( Panel::getPhase , Panel::setPhase ) ;
但是为其他类型定义一个Converter 呢?如何轻松定义短而甜的Converter?例如,字符串到UUID 的转换器。我想在TextField 中显示canonical 36-character hex string,然后向另一个方向显示parse that string back into a UUID。
// String to UUID
UUID uuid = UUID.fromString( myString ) ;
// UUID to String
String myString = uuid.toString() ;
我看到Binder.BindingBuilder 提供了一对方法withConverter,它们都采用一对SerializableFunction 对象。
-
Binder.BindingBuilder::withConverter(SerializableFunction<TARGET,NEWTARGET> toModel, SerializableFunction<NEWTARGET,TARGET> toPresentation) -
Binder.BindingBuilder::withConverter(SerializableFunction<TARGET,NEWTARGET> toModel, SerializableFunction<NEWTARGET,TARGET> toPresentation, String errorMessage)
➥ 那么如何定义SerializableFunction 对象/类对呢?
我注意到这个接口列出了一个已知的子接口ValueProvider<SOURCE,TARGET>。这看起来很熟悉,我有一种预感,它是轻松定义一个简短的简单转换器的关键。但是我不太理解 lambdas 的语法以及这里发生的所有事情。
我不是询问如何编写一个实现Converter 的类。我在问如何编写一对SerializableFunction 参数以传递给上面列出的Binder.BindingBuilder::withConverter 方法作为项目符号。
引用that JavaDoc:
Interface Binder.BindingBuilder<BEAN,TARGET>…
withConverter
default <NEWTARGET> Binder.BindingBuilder<BEAN,NEWTARGET> withConverter(SerializableFunction<TARGET,NEWTARGET> toModel, SerializableFunction<NEWTARGET,TARGET> toPresentation)使用映射函数将绑定映射到另一种数据类型,并将可能的异常作为错误消息。
映射函数用于在表示类型(必须与绑定的当前目标数据类型匹配)和模型类型(可以是任何数据类型并成为绑定的新目标类型)之间进行转换。调用
bind(ValueProvider, Setter)时,绑定的目标类型必须匹配getter/setter类型。例如,可以使用适当的函数将 TextField 绑定到整数类型的属性,例如:
withConverter(Integer::valueOf, String::valueOf);类型参数:
NEWTARGET- 要转换为的类型参数:
toModel- 将旧目标类型转换为新目标类型的函数
toPresentation- 将新目标类型转换为旧目标类型的函数返回:
具有适当类型的新绑定
投掷:
IllegalStateException- 如果绑定已经被调用
【问题讨论】:
-
您是在问如何制作自己的自定义转换器吗?
-
@Jay 不。我不询问如何编写实现
Converter的类。我在问如何编写一对SerializableFunction参数以传递给我的问题中列为项目符号项的Binder.BindingBuilder::withConverter方法。检查我在上一句中链接的 JavaDoc。
标签: data-binding vaadin vaadin8 vaadin10 vaadin-flow