вопросы о DI, ViewModel и т. д.

У меня есть следующий код:

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

У меня есть два вопроса для этого примера:

1) Если я изменяю значение и закрываю окно без фиксации (пользователь может сделать это с помощью кнопки [X]), то только ViewModel будет хранить изменения (и он будет отображаться в графическом интерфейсе даже после повторного открытия), но модель Объект POJO будет хранить старые данные.

если я использовал экземпляр класса Example (без DI), то этот экземпляр сразу получил все изменения.

Например, я не хочу использовать функцию фиксации / отката, но я хочу DI и немедленное обновление. Что я должен делать? (fromcource я могу вызвать «commit» для «события изменения значения поля»)

2) ViewModel имеет конструктор с параметром, и если я попробую открыть ExampleView, как это сделать

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

то я получил очевидное исключение RuntimeException. Могу ли я избежать этого, например, предупреждениями компилятора (или чем-то еще)?

1) Это правильное поведение по умолчанию для ViewModel. Если вы привязываете свойство модели представления к входу, изменения немедленно отражаются в этом связанном свойстве, но будут только удалены в базовый объект модели после его фиксации.

Если вы хотите автоматическое изменение изменений свойств модели просмотра обратно в базовый объект модели, вы можете создать привязку с свойством autocommit true:

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

Вы также можете написать bind(autocommit = true) если это выглядит более понятным для вас. Это приведет к тому, что любые изменения будут автоматически сброшены обратно в базовый объект.

Я также хочу, чтобы вы знали, что, требуя элемента в конструкторе вашей модели представления, вы эффективно предотвращаете его использование с инъекцией, если вы не используете его, как вы, используя setInScope . Это может быть хорошо для вашего случая использования, но стоит отметить.

2) Предстоящий TornadoFX 1.5.10 даст вам лучшее сообщение об ошибке во время выполнения, если вы забудете передать параметр. Он также вводит значения по умолчанию для параметров. Дополнительную информацию см. На странице https://github.com/edvin/tornadofx/pull/227 .

Intereting Posts
Защищенные члены недоступны в функциях расширения? Несоответствие типа приемника с макетами Anko kotlin.TypeCastException: null не может быть применено к ненулевому типу android.support.v7.widget.Toolbar Kotlin dagger 2 Ошибка в Android ViewModel для инъекций Добавление пользовательского вида в includeView Модификаторы доступа Kotlin означают то же, что и в Java? Не удается разрешить строку, переданную параметру vararg в функции расширения Отправлять данные, полученные из Parse SDK в одном классе приложений, в Activity in android Невозможно обновить фрагменты в FragmentPagerAdapter Как установить прокси для Spring AsyncRestTemplate с помощью Netty4ClientHttpRequestFactory? Kotlin coroutines использует продукты и mockito, чтобы издеваться над производственной работой Kotlin – видимость атрибута для сопутствующего объекта Как kotlin делает setOnClickListener принимать функции как параметр Kotlin – единственный экземпляр класса, не являющегося одиночным? Генераторы Java / Kotlin