在 threepenny-gui 中组合事件和属性

Combining Event and an attribute in threepenny-gui

我有一个 Event String,我想将其 sink 放入文本区域。这工作正常,但现在我想将复选框选择的当前值组合到这个字符串。

首先,我使用有效但有问题的复选框的 checkedChange 来完成此操作。如果 checked 值下沉到复选框,则没有 checkedChange-Event 并且文本区域中显示的值未正确更新。

我可以用 get checked 读取复选框选择,但后来我 运行 遇到了结合 Event StringUI Bool(或 UI String 作为布尔值的问题将被转换为字符串)。

编辑:更准确地说,我想做类似

的事情
bCombinedValue <- stepper "" eCombinedValue
element textArea # sink UI.text bCombinedValue

其中 eCombinedValue 具有原始 Event String 和复选框 checked 属性的当前值。

我可以

bCheck <- stepper False $ UI.checkedChange checkBox

但如果我有

,这会失败
element checkBox # sink UI.checked bBool

其他地方(没有 UI.checkedChange)。

我可以使用 show <$> get UI.checked checkBox,但我必须结合使用 Event StringUI String

这是故意的:UI.checkedChange 事件仅在 用户 单击复选框时触发,但 不会 以编程方式设置。目的是 bBool 行为表示复选框的规范状态,UI.checkedChange 事件表示用户更改它的请求,可能会也可能不会被授予。这允许 bidirectional dataflow (see also)。诚然,Threepenny 目前还没有严格遵循这些想法。

对于您的情况,我建议将 UI.checkedChange 事件集成到 bBool 行为中以表示复选框的 "canonical" 状态。如果这不起作用,只需使用 get UI.checkedReactive.Threepenny.unsafeMapIO.

进行破解