美好的一天。
我正在尝试通过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()
}
}
}
}
}
}
}
关于为什么模型无法恢复价值的任何想法?
答案 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
。