【问题标题】:TornadoFX: How to preserve `ItemViewModel`'s property?TornadoFX:如何保留 `ItemViewModel` 的属性?
【发布时间】:2018-07-10 08:56:05
【问题描述】:

美好的一天。 我正在尝试通过config 助手保留ItemViewModel 的属性。我能够成功保存该属性(生成了具有适当.properties 文件的conf 目录),但是在下次启动时,该属性不会恢复其值,仅保留null。这是演示我的问题的示例代码:

import javafx.beans.property.SimpleStringProperty
import tornadofx.*

data class Foo(val doNotPreserveMe: String, val preserveMe: String)

class FooModel : ItemViewModel<Foo>() {
    val doNotPreserveMe = bind { item?.doNotPreserveMe?.toProperty() }
    val preserveMe = bind { SimpleStringProperty(item?.preserveMe, "pm", config.string("pm")) }
}

class FooApp : App(FooView::class)

class FooView : View() {
    private val model = FooModel()

    override val root = form {
        fieldset {
            field("Do not preserve me") { textfield(model.doNotPreserveMe).required() }
            field("Preserve me") { textfield(model.preserveMe).required() }
            button("Do something") {
                enableWhen(model.valid)
                action {
                    model.commit {
                        // ...
                        with(config) {
                            set("pm" to model.preserveMe.value)
                            save()
                        }
                    }
                }
            }
        }
    }
}

关于模型为什么没有恢复价值的任何想法?

【问题讨论】:

  • 你能发布一个完整的示例应用程序吗?我怀疑您在读写时访问了不同的 config 对象。
  • @EdvinSyse,我已经编辑了我的 OP 以包含演示问题的示例代码

标签: kotlin tornadofx


【解决方案1】:

每个组件都有自己的config 存储,由单独的文件支持。确保使用相同的配置文件或应用程序全局配置文件。

您可以参考其他组件的 config 存储,因此一种解决方案是让 View 访问 ViewModel 的配置存储,如下所示:

button("Do something") {
    enableWhen(model.valid)
    action {
        model.commit {
            // ...
            with(model.config) {
                set("pm" to model.preserveMe.value)
                save()
            }
        }
    }
}

但是,有一个更简单且包含更多内容的解决方案,即在 FooModel 的 onCommit 回调中处理保存

override fun onCommit() {
    with(config) {
        set("pm" to preserveMe.value)
        save()
    }
}

在这种情况下,您只需在按钮回调中调用 model.commit()

你也可以使用一个通用的,甚至是全局的配置对象。要么使用控制器的配置存储,要么使用全局存储。要使用全局配置对象,只需在模型和视图中引用app.config

【讨论】:

  • onCommit() 成员函数是一个出色的解决方案。恕我直言,这种模式(验证+配置)在 tornadoFX 指南中值得一提。
  • 太棒了!非常感谢您对指南的小公关,这些天我自己的时间有点紧迫,你看:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 2010-09-20
  • 1970-01-01
  • 2011-04-05
相关资源
最近更新 更多