TornadoFX:如何保留ItemViewModel的属性?

时间:2018-07-10 08:56:05

标签: kotlin tornadofx

美好的一天。 我正在尝试通过ItemViewModel助手来保留config的属性。我能够成功保存属性(已生成带有适当的conf文件的.properties目录),但是在下一次启动时,该属性不会恢复其值,仅保留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()
                        }
                    }
                }
            }
        }
    }
}

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

1 个答案:

答案 0 :(得分: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