【问题标题】:kotlin var property in tornadofx ViewModel and ItemViewModeltornadofx ViewModel 和 ItemViewModel 中的 kotlin var 属性
【发布时间】:2017-10-30 19:23:09
【问题描述】:

根据文档,kotlin var 属性可以在 ViewModel 中绑定为

    // Kotlin var property
class PersonVarViewModel(person: Person) : ViewModel() {
    val name = bind { person.observable(Person::name) }
}

好像不行。 如何解决这个问题。 IDE 在“绑定”下方显示红色下划线 但是如果我写

   val name = bind(RoomType::name)

它没有显示错误。但使用 UI 字段更新值不会更新模型值。 请帮忙

【问题讨论】:

  • 你的属性可能需要是var,而不是val,我认为你需要使person成为varval类的成员跨度>
  • 其实name可以是val,问题出在你的类声明上,看我的回答
  • 发布您看到的实际错误

标签: tornadofx


【解决方案1】:

在你的类声明中,使用var person: Person

person 需要是类的成员,而不仅仅是构造函数的参数。您可以通过在构造函数参数中声明 varval 来做到这一点,或者您可以以常规方式将成员字段添加到类并分配它(可能使用 by property,但不确定这是否是您想要的)

class PersonVarViewModel(var person: Person) : ViewModel() {
    val name = bind { person.observable(Person::name) }
}

对于ItemViewModel ...

class PersonVarViewModel(var person: Person) : ItemViewModel<Person>() {
    val name = bind { person.observable(Person::name) }
}

【讨论】:

  • ItemViewModel() 怎么样?
  • 你的意思是编译器在抱怨吗?或者别的什么
  • 谢谢!这结束了长时间的搜索,诀窍是将 observable 绑定到基本变量而不是属性
【解决方案2】:

您需要让 ItemViewModel 了解 person 实例,但还需要让它对稍后对基础项目的更改做出反应。您需要将传入的人员分配给 ItemViewModel 的item 属性。这可以通过在构造函数中传递它来完成:

class PersonVarViewModel(person: Person) : ItemViewModel<Person>(person) {
    val name = bind(Person::name)
}

请注意,如果添加此构造函数,则只能在手动将其推送到作用域时使用带有注入的视图模型,因为框架无法实例化它。因此,您也应该添加一个 noargs 构造函数,或者干脆省略 person 参数并在创建后分配给 item。

如果您更新底层人员中的值,则只有当该值是可观察的时,它才会在视图模型中可见。如果没有,您必须致电 rollback() 以更新此人的更改。您只能为特定字段调用回滚。

如果可能,请在域模型对象中使用可观察属性以避免此类问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    相关资源
    最近更新 更多