Элемент ItemViewModel имеет значение null

у меня урок

  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 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)
}

Я пытаюсь, на мой взгляд, привязать данные из текстовых полей/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, это null .

Что мне нужно сделать, чтобы получить объект data class Patient? не модель просмотра. Спасибо


person Jozef    schedule 04.11.2017    source источник


Ответы (1)


Вам нужно установить item в ViewModel. Чтобы создать новый экземпляр, выполните model.item = Patient(...). Однако вам не обязательно делать это заранее.

Экземпляр пациента также можно передать суперконструктору ViewModel для автоматической установки свойства item:

class PatientModel(patient: Patient) : ItemViewModel<Patient>(patient)

Имейте в виду, что вам нужен конструктор без аргументов, чтобы иметь возможность использовать вашу модель представления с инъекцией.

Поскольку ваш класс Patient неизменяем, у ViewModel нет возможности автоматически записывать данные обратно в него. Чтобы преодолеть это, переопределите onCommit в ViewModel и назначьте новое значение свойству item на основе значений в свойствах ViewModel на тот момент.

override fun onCommit() {
    item = Patient(birthNumber.value, ...)
}

Наблюдаемые свойства JavaFX предназначены для использования с изменяемыми структурами данных, поэтому вам придется пройти через пару дополнительных обручей, чтобы использовать их с неизменяемыми значениями.

person Edvin Syse    schedule 04.11.2017