java - MVVM绑定(bind),保存前获取以前的表单值

标签 java mvvm data-binding viewmodel zk

问题

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

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

我正在使用全局变量来存储对象的初始状态,但变量似乎也更新了,而我没有不明白为什么。

<小时/>

代码

看一下代码,它更明确(我删除了不相关的代码,这样更容易阅读):

模型 (Person.java):

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

    @Column
    private String lastName;

    @Column
    private String firstName;

}

View 模型 (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)包含新值?仅绑定(bind) person 对象。

最佳答案

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

现在提出一些解决方案。

第一个解决方案是从数据库中获取一个新对象作为原始对象。
但是,如果您这样做=>这应该是服务器的更多代码,而不是 GUI 部分的代码。

第二个解决方案是使用 form.
您只会在某些数据发生更改时感兴趣 => 表单处于脏状态,您可以使用它启用/禁用保存按钮。
因此,如果启用该按钮,您确信会发生一些变化。
如果您需要知道确切的更改,您需要“克隆”您的对象,以便您可以检查出来。
但我认为表单对象解决了您在未进行任何更改时无法按下按钮的问题。

希望这对你有一点帮助。

关于java - MVVM绑定(bind),保存前获取以前的表单值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39040091/

相关文章:

ajax - 基于 DOM 的数据存储,最佳选择/性能?

java - 如何在 spring mvc 中数据绑定(bind)列出选定的复选框

java.lang.NoClassDefFoundError : loginpackage/LoginServlet (wrong name: WEB-INF/classes/loginpackage/LoginServlet)

c# - MVVM命令错误

java - 启用 java 安全管理器时,获取系统属性 "os.arch"时权限被拒绝

android - 当 Retrofit 请求失败或成功时,如何在 Repository 和 ViewModel 类之间进行通信?

c# - 在 MVVM 模式中控制 MediaElement 及其源

c# - 嵌套 INotifyPropertyChanged 类不起作用

java - 如何处理执行 doInBackground() 时发生错误的异常

java - Spring - 使用@PostCostruct 时获取 NullPointErexception