我有以下代码
class MainView : View("Example") {
val model: UserModel = UserModel()
init {
model.item = User(status = true)
}
override val root = vbox {
useMaxWidth = true
label(model.status)
button("Get new status") {
action {
model.item.updateStatus()
println("Status in model: ${model.status.value}")
println("Status in backing object: ${model.item.status}")
}
}
}
}
class User(var status: Boolean, val api: Api = Api()) {
fun updateStatus() {
status = api.getStatus()
}
}
class UserModel : ItemViewModel<User>() {
val status = bind(User::status)
}
class Api {
fun getStatus(): Boolean {
val list = listOf(true, false)
return list[(Math.random() * list.size).toInt()]
}
}
点击按钮后,model.itemProperty
会发生变化,但model.status
没有变化。调用model.rollback()
可以解决这个问题,但我认为在支持属性发生更改后,这不是更新ItemViewModel
的正确方法。是否有任何TornadoFX更新UserModel
(以及相应的View作为结果)而无需向User
分配新model.item
对象的方法?
答案 0 :(得分:1)
当您的支持对象无法观察时,调用rollback()
是正确的做法。语义完全适合您的用例,因为回滚可确保您的ViewModel
与已分配的后备对象中的值匹配。
在你的情况下,你知道发生了什么变化,所以如果你想保持现有的价值并只更新状态,你可能会对它有实际意义:
model.status.value = model.item.status
就个人而言,我总是尽可能使用可观察的值,它们不会添加太多带有新语法的样板,并且它们使您能够以更加声明的方式编写代码。为了完整起见,您可以在status
中将User
声明为可观察的属性:
val statusProperty = SimpleBooleanProperty()
var status by statusProperty