0

我有以下代码

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(以及相应的视图作为结果)而不分配新User对象model.item

4

1 回答 1

1

当您的支持对象不可观察时,调用rollback()是正确的做法。语义完全适合您的用例,因为回滚确保您ViewModel匹配已分配的支持对象中的值。

在您的情况下,您知道发生了什么变化,因此如果您想保持现有值不变并且只更新状态,您不妨务实:

model.status.value = model.item.status

就个人而言,我总是尽可能使用可观察值,它们不会为新语法添加太多样板,它们使您能够以更具声明性的方式编写代码。为了完整起见,这是您将 声明status为可观察属性的方式User

val statusProperty = SimpleBooleanProperty()
var status by statusProperty
于 2017-07-22T07:50:40.783 回答