问题
我有一个 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 个对象(person
和 initialPerson
)包含新值?仅绑定(bind) person
对象。
最佳答案
快速回答:Java 通过引用威胁对象,这意味着 2 个变量指向相同的内存位置。
现在提出一些解决方案。
第一个解决方案是从数据库中获取一个新对象作为原始对象。
但是,如果您这样做=>这应该是服务器的更多代码,而不是 GUI 部分的代码。
第二个解决方案是使用 form.
您只会在某些数据发生更改时感兴趣 => 表单处于脏状态,您可以使用它启用/禁用保存按钮。
因此,如果启用该按钮,您确信会发生一些变化。
如果您需要知道确切的更改,您需要“克隆”您的对象,以便您可以检查出来。
但我认为表单对象解决了您在未进行任何更改时无法按下按钮的问题。
希望这对你有一点帮助。
关于java - MVVM绑定(bind),保存前获取以前的表单值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39040091/