preguntas sobre DI, ViewModel, etc.

Tengo el siguiente código:

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

Tengo dos preguntas para este ejemplo:

1) Si cambio el valor y cierro la window sin confirmación (el usuario puede hacer esto con el button de ayuda [X]), solo ViewModel almacenará los cambios (y se mostrará en GUI incluso después de la reapertura), pero el model El object POJO mantendrá los datos antiguos.

si utilicé una instancia de la class Ejemplo (sin DI), esta instancia recibió todos los cambios a la vez.

Por ejemplo, no quiero la funcionalidad de confirmación / restitución, pero quiero DI y actualización inmediata. ¿Qué debería hacer? (ofcource puedo llamar "commit" para "evento de valor de cambio de campo de text")

2) ViewModel tiene constructor con parámetro y si bash abrir ExampleView como este

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

luego obtuve una RuntimeException obvia. ¿Puedo evitar esto, por ejemplo, por las advertencias del comstackdor (o por otra cosa)?

1) Este es el comportamiento pnetworkingeterminado correcto de ViewModel. Si vincula una propiedad del model de vista a una input, los cambios se reflejan inmediatamente en esa propiedad vinculada, pero solo se aplicarán al object model subyacente una vez que lo haya confirmado.

Si desea confirmar automáticamente los cambios en las properties del model de vista en el object model subyacente, puede crear el enlace con la propiedad autocommit establecida en verdadero:

 val data = bind(true) { item?.dataProperty() } 

También puede escribir bind(autocommit = true) si eso le parece más claro. Esto provocará que cualquier cambio se vacíe automáticamente en el object subyacente.

También quiero informarle que al requerir un elemento en el constructor de su model de vista, está efectivamente evitando que se use con inyección a less que lo setInScope como lo hace con setInScope . Esto podría estar bien para su caso de uso, pero vale la pena señalarlo.

2) El próximo TornadoFX 1.5.10 le dará un mejor post de error de time de ejecución si olvida pasar un parámetro. También introduce valores pnetworkingeterminados para los parameters. Consulte https://github.com/edvin/tornadofx/pull/227 para get más información.

  • Las properties vinculadas no funcionan
  • Forma de configurar las properties de PrimaryStage o Scene en TornadoFX
  • Tornadofx Javafx - Cómo volver a cargar una vista / componente
  • ¿Cómo cancelar la suscripción a events en TornadoFX?
  • TornadoFX - eliminar elemento con ContextMenu hacer clic derecho
  • TornadoFX: Type-Safe CSS con otras bibliotecas
  • TornadoFX envuelve las classs de dominio en ItemViewModel
  • TornadoFX JavaFX Sync Desplazarse por las vistas de tabla
  • ¿Cómo llenar el ancho de la tabla disponible con columnas?
  • No se puede hacer que el nodo se centre en un StackPane con TornadoFX
  • En TornadoFX, ¿cómo puedo separar layouts en diferentes classs y luego usarlos en el generador?