ItemViewModel 项目为空
ItemViewModel item is null
我有class
data class Patient(
val birthNumber: String ,
val firstName: String ,
val lastName: String ,
val birthDate: LocalDate ,
val healthInsurance: InsuranceCompany ,
val hospitalizations : List<Hospitalization> = emptyList()
)
机智 itemViewmodel class
class PatientModel : ItemViewModel<Patient>() {
val birthNumber = bind(Patient::birthNumber)
val firstName = bind(Patient::firstName)
val lastName = bind(Patient::lastName)
val birthDate = bind(Patient::birthDate)
val healthInsurance = bind(Patient::healthInsurance)
val hospitalizations = bind(Patient::hospitalizations)
}
在我看来,我正在尝试将数据从 textfields/combox 绑定到我的 PatientModel 对象,如下所示
var model = PatientModel()
val controller: AddPatientController by inject()
override val root = VBox()
init {
title = "Pridat pacienta"
with(root) {
goHome()
form {
fieldset("Personal Information") {
field("First name") {
textfield().bind(model.firstName)
}
field("Last Name") {
textfield().bind(model.lastName)
}
field("birthNumber") {
textfield().bind(model.birthNumber)
}
field("InsuranceCompany") {
combobox<InsuranceCompany> {
items = controller.insuranceComp
}.bind(model.healthInsurance)
}
field("birthDate") {
datepicker().bind(model.birthDate)
}
但最后当我调用 model.item
时它是空的。
我需要做什么才能获得 data class Patient
对象?不是视图模型。谢谢
你需要在ViewModel
中设置一个item
。要给它一个新实例,请执行 model.item = Patient(...)
。不过,您不一定需要事先执行此操作。
也可以将患者实例传递给 ViewModel
超级构造函数以自动设置 item
属性:
class PatientModel(patient: Patient) : ItemViewModel<Patient>(patient)
请注意,您需要一个无参数构造函数才能通过注入使用视图模型。
由于您的 Patient
class 是不可变的,因此 ViewModel 无法自动将数据写回其中。要解决这个问题,请覆盖 ViewModel
中的 onCommit
并根据当时 ViewModel 属性中的值将新值分配给 item
属性。
override fun onCommit() {
item = Patient(birthNumber.value, ...)
}
JavaFX 可观察属性旨在与可变数据结构一起使用,因此您必须跳过几个额外的环节才能将它们与不可变值一起使用。
我有class
data class Patient(
val birthNumber: String ,
val firstName: String ,
val lastName: String ,
val birthDate: LocalDate ,
val healthInsurance: InsuranceCompany ,
val hospitalizations : List<Hospitalization> = emptyList()
)
机智 itemViewmodel class
class PatientModel : ItemViewModel<Patient>() {
val birthNumber = bind(Patient::birthNumber)
val firstName = bind(Patient::firstName)
val lastName = bind(Patient::lastName)
val birthDate = bind(Patient::birthDate)
val healthInsurance = bind(Patient::healthInsurance)
val hospitalizations = bind(Patient::hospitalizations)
}
在我看来,我正在尝试将数据从 textfields/combox 绑定到我的 PatientModel 对象,如下所示
var model = PatientModel()
val controller: AddPatientController by inject()
override val root = VBox()
init {
title = "Pridat pacienta"
with(root) {
goHome()
form {
fieldset("Personal Information") {
field("First name") {
textfield().bind(model.firstName)
}
field("Last Name") {
textfield().bind(model.lastName)
}
field("birthNumber") {
textfield().bind(model.birthNumber)
}
field("InsuranceCompany") {
combobox<InsuranceCompany> {
items = controller.insuranceComp
}.bind(model.healthInsurance)
}
field("birthDate") {
datepicker().bind(model.birthDate)
}
但最后当我调用 model.item
时它是空的。
我需要做什么才能获得 data class Patient
对象?不是视图模型。谢谢
你需要在ViewModel
中设置一个item
。要给它一个新实例,请执行 model.item = Patient(...)
。不过,您不一定需要事先执行此操作。
也可以将患者实例传递给 ViewModel
超级构造函数以自动设置 item
属性:
class PatientModel(patient: Patient) : ItemViewModel<Patient>(patient)
请注意,您需要一个无参数构造函数才能通过注入使用视图模型。
由于您的 Patient
class 是不可变的,因此 ViewModel 无法自动将数据写回其中。要解决这个问题,请覆盖 ViewModel
中的 onCommit
并根据当时 ViewModel 属性中的值将新值分配给 item
属性。
override fun onCommit() {
item = Patient(birthNumber.value, ...)
}
JavaFX 可观察属性旨在与可变数据结构一起使用,因此您必须跳过几个额外的环节才能将它们与不可变值一起使用。