考虑集合属性的表单的脏状态

时间:2013-03-22 18:25:41

标签: java zk

我有以下型号:

public class Person {
    private String name;
    private Set<Phone> phones;
    // setters and getters
}

我的ViewModel有以下filds:

public class PersonViewModel {

    private Person selected;
    private Phone selectedPhone;

    // setters and getters for fields

    @Command
    public void save() {
        // basically persists selected field
    }

    // additional commands

}

我的视图会创建一个表单,如:

<groupbox form="@id('fx') @load(vm.selected) @save(vm.selected, before='save')">

并将文本框中的名称和列表框中的电话公开。每当我选择手机时,我都会将属性设为selectedPhone。可以使用我视图中的其他文本字段编辑手机。

当我更改名称时,我的表单的脏状态会更新,这很好。当我选择手机时,我可以看到我的viewmodel的属性selectedPhone已设置。但是当我使用绑定到selectedPhone的editBox更改手机时,我的表单的脏状态不会改变。

这是预期的,因为我正在更改ViewModel而不是表单。但是解决这个问题的方法是什么,因为当手机被更换时,意味着人也会被改变,因为有些东西需要保存?

视图实现如下:

...
<groupbox form="@id('fx') @load(vm.selected) @save(vm.selected, before='save')" vflex="1">
    <textbox width="50px" value="@bind(fx.name)" />
    <listbox vflex="true" model="@load(fx.phones)" selectedItem="@bind(vm.selectedPhone)">
        <!-- shows the phone record -->
    </listbox>
    <textbox width="50px" value="@bind(vm.selectedPhone.number)" />
</groupbox>
....

当我更改名称时,它会更新表单(fx)并且其状态为脏。但是更改selectedPhone.number它不会传递表单,因此它没有标记为脏。电话是一个集合,如果fx集合中包含的电话属性被更改,如何在GUI中显示并将整个表单标记为脏?

1 个答案:

答案 0 :(得分:2)

在考虑了一下情况后,对我来说有一个简单的解决方案,
只需添加一个额外的对象,因为您的问题是您无法访问fx
所以我们只创建一个容器,这样你就可以在更改集合中的某些内容时访问新的fx

public class MyPersonContainer {
  private Person selected;
  private Phone selectedPhone;
  //getter/setter
}

并更改您的VM

public class PersonViewModel {
   //private Person selected;
   //private Phone selectedPhone;
   private MyPersonContainer container;
   ...
}

以及您的观点

<groupbox form="@id('fx') @load(vm.container) @save(vm.container, before='save')">
<listbox vflex="true" model="@load(fx.selected.phones)" selectedItem="@bind(fx.selectedPhone)">
...
<textbox width="50px" value="@bind(fx.selectedPhone.number)" />