<zk>
<grid width="auto" sizedByContent="true" span="1" sclass="tblWithoutHover">
<attribute name="onCreate">
authorPublisherEtcInclude.insertBefore(self, authorBox);
</attribute>
<columns>
<column/>
<column/>
</columns>
<rows>
<row valign="center">
<cell colspan="2"><label use="${authorPublisherComponents.originalFieldsLabel}"/></cell>
</row>
<row valign="center">
<label use="${authorPublisherComponents.titleAuthorOriginalLabel}"/>
<textbox use="${authorPublisherComponents.titleAuthorOriginalTextbox}"/>
</row>
<row valign="center">
<label use="${authorPublisherComponents.mainAuthorOriginalLabel}"/>
<textbox use="${authorPublisherComponents.mainAuthorOriginalTextbox}"/>
</row>
<row valign="center">
<label use="${authorPublisherComponents.mainAuthorResponsibilityLabel}"/>
<selectbox use="${authorPublisherComponents.mainAuthorResponsibilitySelectbox}"/>
</row>
<row valign="center">
<label use="${authorPublisherComponents.authorityDatesOriginalLabel}"/>
<textbox use="${authorPublisherComponents.authorityDatesOriginalTextbox}"/>
</row>
<row valign="center">
<cell>
<label use="${authorPublisherComponents.addMainAuthorsOriginalLabel}"/>
<toolbarbutton use="${authorPublisherComponents.addAuthorButton}"/>
</cell>
<cell id="addAuthorsCell">
<grid id="addAuthorsContainer" model="@bind(ivm.inventory.addAuthorsBeans)">
<columns>
<column/>
<column/>
<column/>
</columns>
<rows>
<row>
<textbox value="@load(xgbfxb.authorName)" onChange="@command('test', component = self, index=s.index)"/>
<button label="Del" onClick="@command('delAuthor', container=addAuthorsContainer, index=modelIndex )">
<custom-attributes modelIndex="${s.index}"/>
</button>
</row>
</rows>
</grid>
<textbox use="${authorPublisherComponents.addMainAuthorsOriginalTextbox}"/>
</cell>
</row>
这是我的 zul 页面的一部分。 addAuthorsBeans 是带有字段的类列表。当我在我的组合框中更改数据时,列表中所有类的应用程序调用集方法,但我希望它只调用相应的项目。可能吗?还是我应该使用 onChange 事件和 ViewModel 方法施放黑魔法?
编辑 (21/12/2013).它的工作原理是这样的:我有三个项目1,2,3.然后我激活setAuthor的2项目。然后应用程序调用 setAuthor 方法 对于 2 个项目,然后是 3 个项目,然后是 1 个项目,然后在容器中查找此方法。
我有"黑魔法"临时解决方案来创建静态变量并在第一次调用 setAuthor 方法时更改它并在容器中取消阻止它。
但这不是最终的解决方案,因为它消耗了更多的资源,而且真的不是它应该如何真正工作。
解决方案:如果你在另一个网格中有带有模型的网格,它会表现得很奇怪。所以只需使用列表框代替。
combobox
只会触发对象女巫表示项的item.setAuthorName(...)
。如果调用了其他资源库,则必须在 ViewModel 类中具有与此关联的@NotifyChange
或@DependsOn
。
编辑:尝试更改:
<grid model="@bind(ivm.inventory.addAuthorsBeans)">
自
<grid model="@load(ivm.inventory.addAuthorsBeans)">
更新:我为本主题创建的工作示例:http://forum.zkoss.org/question/90188/notifychange-to-grid-that-is-inside-a-row-of-another-grid/?answer=90284#post-id-90284 ):
第一个简单的pojo类:
package be.chillworld;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author chillworld
*/
public class Person {
private int id;
private String naam;
private List<Person> childs = new ArrayList<Person>();
public Person(int id) {
this.id = id;
naam = "test " + id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setNaam(String naam) {
this.naam = naam;
}
public String getNaam() {
System.out.println("asked getter (naam) of "+ id);
return naam;
}
public List<Person> getChilds() {
System.out.println("asked getter (childs) of "+ id);
return childs;
}
public void setChilds(List<Person> childs) {
this.childs = childs;
}
public boolean addChild(Person person) {
return childs.add(person);
}
@Override
public String toString() {
return "Person{" + "id=" + id + ", name=" + getNaam() + '}';
}
}
然后是索引虚拟机:
package be.chillworld;
import java.util.ArrayList;
import java.util.List;
import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
/**
*
* @author chillworld
*/
public class IndexVm {
private List<Person> persons;
int i;
public IndexVm() {
System.out.println("starting creating list");
persons = new ArrayList<Person>();
for (i = 0; i < 100; i++) {
Person person = new Person(i);
person.addChild(new Person(++i));
persons.add(person);
}
System.out.println("ending creating list");
}
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
@Command
public void showIndex(@BindingParam("person") Person person) {
System.out.println("changed name");
person.setNaam("Chillworld");
BindUtils.postNotifyChange(null, null, person, "naam");
}
@Command
public void addChild(@BindingParam("person") Person person) {
System.out.println("add child");
Person child = new Person(++i);
child.setNaam("new child");
person.addChild(child);
BindUtils.postNotifyChange(null, null, person, "childs");
}
}
最后是索引.zul:
<?xml version="1.0" encoding="UTF-8"?>
<zk xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.zkoss.org/2005/zul"
xsi:schemaLocation="http://www.zkoss.org/2005/zul
http://www.zkoss.org/2005/zul/zul.xsd">
<window border="normal" closable="false"
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('be.chillworld.IndexVm')">
<grid width="1000px" model="@load(vm.persons)">
<columns>
<column label="naam" />
<column label="add child" />
<column label="childs" />
</columns>
<template name="model" >
<row>
<textbox value="@bind(each.naam)" />
<button onClick="@command('addChild',person = each)" label="add child"/>
<grid width="400px" model="@load(each.childs)">
<columns>
<column label="naam" />
<column label="button" />
</columns>
<template name="model" var="item">
<row>
<textbox value="@bind(item.naam)" />
<button onClick="@command('showIndex',person = item)" label="change value"/>
</row>
</template>
</grid>
</row>
</template>
</grid>
</window>
</zk>
这给出了作为输出(启动后):
changed name
asked getter of 11
changed name
asked getter of 7
changed name
asked getter of 19
寒意寒意。