MVVM绑定,在保存

时间:2016-08-19 13:18:18

标签: java mvvm data-binding viewmodel zk

问题

我有一个Person对象,可以在弹出窗口中进行编辑。

我需要知道,当保存表单时,如果某些值已更改

我使用全局变量来存储对象的初始状态,但似乎变量更新而且我不知道明白为什么。

代码

看看代码,它更明确(我删除了不相关的代码,因此更容易阅读):

模型 Person.java ):

@Entity
@Table(name = "person")
public class Person {

    @Column
    private String lastName;

    @Column
    private String firstName;

}

查看模型 PersonVm.java ):

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class PersonVm {

    private Person person;
    private static Person initialPerson;
    private PersonGroupingVm personGroupingModel;

    @Init
    public void init(@ExecutionArgParam("person") Person pers, @ContextParam(ContextType.VIEW) Component view) {
        Selectors.wireComponents(view, this, false);
        if (pers != null) 
            person = pers;
        setPersonGroupingModel(new PersonGroupingVm(personMgr.getPersons(), new PersonComparator(), false));
    }

    @Command
    @NotifyChange("person")
    public void openEditPersonDialog(@BindingParam("person") Person pers) {
        initialPerson = pers;
        Map<String, Object> args = new HashMap<String, Object>();
        args.put("person", pers);
        Executions.createComponents(".../editPerson.zul", null, args);
    }

    @Command
    @NotifyChange("person")
    public void savePerson() {
        Clients.alert(person.equals(initialPerson) + "");
        Clients.alert(person.getFirstName());
        Clients.alert(initialPerson.getFirstName());
        // person and initialPerson both contain new values !
    }

}

查看 persons.zul ):

<vlayout apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('ch.myorg.vm.PersonVm')">
    <grid model="@load(vmp.personGroupingModel)">
        ...
        <template name="model" var="pers">
            <row>
                <label value="@load(pers.firstName)"/>
                <label value="@load(pers.lastName)"/>
                <button onClick="@command('openEditPersonDialog', person=pers)"/>
            </row>
        </template>
    </grid>
</vlayout>

查看 editPersonDialog.zul ):

<window apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('ch.myorg.vm.PersonVm')">
    <div form="@id('p') @load(vm.person) @save(vm.person, before='savePerson')">
        <textbox value="@bind(p.firstName)"/>
        <textbox value="@bind(p.lastName)"/>
        <button label="${labels.action.validate}" onClick="@command('savePerson')"/>
    </div>
</window>

为什么我的2个对象(personinitialPerson)包含新值?只绑定person对象。

1 个答案:

答案 0 :(得分:1)

快速回答:Java威胁通过引用对象,这意味着2个变量指向相同的内存位置。

现在解决一些问题。

第一个解决方案是从DB中获取一个新的Object作为原始对象 但是,如果你这样做=&gt;这应该是服务器的更多代码,而不是GUI部分。

第二种解决方案是使用form.
如果某些数据发生了变化,您只会被强行插入=&gt;表单有一个dirtystatus女巫你可以启用/禁用保存按钮。
因此,如果启用该按钮,您可以确定存在一些更改 如果你需要知道你需要的确切变化&#34;克隆&#34;你的对象,所以你可以检查出来。
但我认为表单对象解决了在没有进行任何更改时无法按下按钮的问题。

希望这可以帮助你一点点。