<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是带有字段的类的列表。当我更改组合框中的数据时,应用程序会为列表中的所有类调用set方法,但我希望它仅对相应项进行调用。可能吗?还是应该使用onChange事件和ViewModel方法投下魔咒?

编辑(21/12/2013)。它的工作方式是这样的:我有3个项目1、2、3。然后为2个项目激活setAuthor。然后应用程序对2个项目调用setAuthor方法,然后对3个项目,然后对1个项目调用setAuthor方法,然后在容器中查找此方法。

我有一个“黑魔法”临时解决方案,可以创建静态变量并在第一次调用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() + '}';
    }
}


然后IndexVM:

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");
    }
}


最后是index.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


Greetz寒意。

07-26 04:21