0

次のコードがあります。

class ExampleView :View("My Example view") {
  val model:ExampleModel by inject()

  override val root= vbox {
    textfield(model.data)
    button("Commit") {
      setOnAction {
        model.commit()
        closeModal()
      }
    }
    button("Rollback") {
      setOnAction {
        model.rollback()
        closeModal()
      }
    }
    button("Just quit") {
      setOnAction {
        closeModal()
      }
    }
  }

}

class Example() {
  var data by property<String>()
  fun dataProperty() = getProperty(Example::data)
}

class ExampleModel(example: Example) : ItemViewModel<Example>() {
  init {
    item = example
  }
  val data = bind { item?.dataProperty() }
}

class MainView : View() {
  val example:Example
  override val root = BorderPane() 

  init {
    example = Example()
    example.data = "Data for example"
    val exampleModel = ExampleModel(example)
    with(root){
      top {
        menubar {
          menu("Test") {
            menuitem("Example - 1") {
              val scope = Scope()
              setInScope(exampleModel, scope)
              find<ExampleView>(scope).openWindow()
            }
            menuitem("Example - 2") {
              val scope = Scope()
              setInScope(exampleModel, scope)
              find<ExampleView>(scope).openWindow()
            }
          }
        }
      }
    }
  }
}

この例について 2 つの質問があります。

1)値を変更してコミットせずにウィンドウを閉じると(ユーザーは[X]ボタンを使用してこれを行うことができます)、ViewModelのみが変更を保存します(そして、再度開いた後でもGUIに表示されます)が、モデルPOJO オブジェクトは古いデータを保持します。

Example クラスのインスタンス (DI なし) を使用した場合、このインスタンスはすべての変更を一度に受け取りました。

たとえば、コミット/ロールバック機能は必要ありませんが、DI と即時更新が必要です。どうすればいいですか?(もちろん、「テキストフィールド変更値イベント」の「コミット」を呼び出すことができます)

2)ViewModelにはパラメーターを持つコンストラクターがあり、このようにExampleViewを開こうとすると

find<ExampleView>(Scope()).openWindow()

その後、明らかな RuntimeException が発生しました。たとえば、コンパイラの警告 (または他の何か) によってこれを回避できますか?

4

1 に答える 1