Может ли модель в MVC откатиться до последнего действительного состояния?

Leder спросил: 03 ноября 2018 в 09:22 в: kotlin

Отсюда я следую Руководству по TornadoFX, пытаясь запустить пример мастера: Wizard

У меня возникла следующая проблема, см. пункт 3):

1) Когда я нажимаю Cancel значения возвращаются к пустым значениям при следующем открытии

2) Когда я нажимаю Finish, значения остаются в мастере при следующем открытии

3) Когда я сейчас нажимаю Cancel, изменения не откатываются до 2), а до 1), т.е. е. пустые поля

Как получить другое поведение Cancel: откат CustomerModel до последнего действительного состояния?

Это мой обновленный CustomerWizard.kt:

package com.example.demo.viewimport com.example.demo.app.Customer
import com.example.demo.app.CustomerModel
import tornadofx.*
class CustomerWizard : Wizard("Create customer", "Provide customer information") {
    val customer: CustomerModel by inject()    override val canGoNext = currentPageComplete
    override val canFinish = allPagesComplete    override fun onCancel() {
        super.onCancel()
        customer.rollback()    }    override fun onSave() {
        super.onSave()
        customer.commit()        println("customer.name=" + customer.name)
        println("customer.type=" + customer.type)
        println("customer.zip=" + customer.zip)
        println("customer.city=" + customer.city)
    }    init {
        graphic = resources.imageview("/graphics/customer.png")
        add(BasicData::class)
        add(AddressInput::class)
    }
}class BasicData : View("Basic Data") {
    val customer: CustomerModel by inject()    override val complete = customer.valid(customer.name)    override val root = form {
        fieldset(title) {
            field("Type") {
                combobox(customer.type, Customer.Type.values().toList())
            }
            field("Name") {
                textfield(customer.name).required()
            }
        }
    }
}class AddressInput : View("Address") {
    val customer: CustomerModel by inject()    override val complete = customer.valid(customer.zip, customer.city)    override val root = form {
        fieldset(title) {
            field("Zip/City") {
                textfield(customer.zip) {
                    prefColumnCount = 5
                    required()
                }
                textfield(customer.city).required()
            }
        }
    }
}

Это мой CustomerModel.kt:

package com.example.demo.appimport tornadofx.*class CustomerModel(customer: Customer? = null) : ItemViewModel<Customer>(customer) {
    val name = bind(Customer::nameProperty, autocommit = true)
    val zip  = bind(Customer::zipProperty, autocommit = true)
    val city = bind(Customer::cityProperty, autocommit = true)
    val type = bind(Customer::typeProperty, autocommit = true)
}

Это мой MainView.kt:

package com.example.demo.viewimport com.example.demo.app.Customer
import com.example.demo.app.CustomerModel
import com.example.demo.app.Styles
import javafx.geometry.Pos
import javafx.scene.layout.Priority
import javafx.scene.paint.Color
import tornadofx.*class MainView : View("Hello TornadoFX") {    private val myCustomer: Customer? = Customer("test", 12345, "", Customer.Type.Private)
    override val root = drawer {
            item("Generate & sign", expanded = true) {
                button("Add Customer").action {
                    find<CustomerWizard>(Scope(CustomerModel(myCustomer))).openModal()
                }
            }
            item("Verify") {
                borderpane {
                    top = label("TOP") {
                        useMaxWidth = true
                        alignment = Pos.CENTER
                        style {
                            backgroundColor += Color.RED
                        }
                    }                    bottom = label("BOTTOM") {
                        useMaxWidth = true
                        alignment = Pos.CENTER
                        style {
                            backgroundColor += Color.BLUE
                        }
                    }                    left = label("LEFT") {
                        useMaxWidth = true
                        useMaxHeight = true
                        style {
                            backgroundColor += Color.GREEN
                        }
                    }                    right = label("RIGHT") {
                        useMaxWidth = true
                        useMaxHeight = true
                        style {
                            backgroundColor += Color.PURPLE
                        }
                    }                    center = label("CENTER") {
                        useMaxWidth = true
                        useMaxHeight = true
                        alignment = Pos.CENTER                        style {
                            backgroundColor += Color.YELLOW
                        }
                    }
                }
            }
            item("Sign next") {
                borderpane {
                    top = label("TOP") {
                        useMaxWidth = true
                        alignment = Pos.CENTER
                        style {
                            backgroundColor += Color.RED
                        }
                    }                    bottom = label("BOTTOM") {
                        useMaxWidth = true
                        alignment = Pos.CENTER
                        style {
                            backgroundColor += Color.BLUE
                        }
                    }                    left = label("LEFT") {
                        useMaxWidth = true
                        useMaxHeight = true
                        style {
                            backgroundColor += Color.GREEN
                        }
                    }                    right = label("RIGHT") {
                        useMaxWidth = true
                        useMaxHeight = true
                        style {
                            backgroundColor += Color.PURPLE
                        }
                    }                    center = label("CENTER") {
                        useMaxWidth = true
                        useMaxHeight = true
                        alignment = Pos.CENTER                        style {
                            backgroundColor += Color.YELLOW
                        }
                    }
                }
            }
        }        //class Link(val name: String, val uri: String)
        //class Person(val name: String, val nick: String)        // Sample data variables left out (iPhoneUserAgent, TornadoFXScreencastsURI, people and links)
    }

0 ответов