2

ZK6の新しいツリーバインディングメカニズムを使用したモデルバインディングに関して問題があります。まず、私のコードは次のとおりです。

ズール:

<div id="win" apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('mira.web.composer.PermissionDesignerModel')"
style="width:98%; text-align:center;" vflex="1">

<tree id="permissionTree" width="100%" model="@bind(vm.treeModel)"
    style="text-align:left;" vflex="2">
    <treecols>
        <treecol label="Item" width="400px" />
        <treecol label="Typ" />
        <treecol label="Ausgabe" />
        <treecol label="Einfügen" width="100px" />
    </treecols>
    <template name="model" var="node">
        <treeitem open="@bind(node.open)">
            <treerow>
                <treecell>
                    <textbox value="@bind(node.data.name)" />
                </treecell>
                <treecell>
                    <combobox mold="rounded" readonly="true"
                        model="@load(vm.allAttributeTypes)"
                        selectedIndex="@bind(node.data.attType)">
                        <template name="model">
                            <comboitem label="@load(each.name)"
                                value="@load(each.id)" />
                        </template>
                    </combobox>
                </treecell>
                <treecell>
                    <checkbox label="Ausgabe"
                        checked="@bind(node.data.isOutput)" />
                </treecell>
                <treecell>
                    <button label="Einfügen"
                        onClick="@command('insertNode', node=node)" />
                </treecell>
            </treerow>
        </treeitem>
    </template>
</tree>

モデル:

public class PermissionDesignerModel {

ClassPathResource res = new ClassPathResource("/beans.xml");
BeanFactory beanFactory = new XmlBeanFactory(res);
private PermissionTreeModel treeModel;

@Command
public void insertNode(@BindingParam("node") PermissionTreeNode node) {
    node.setOpen(false);
}


public PermissionTreeModel getTreeModel() throws ParseException {
    if (treeModel == null) {
        PermissiontreeBuilder builder = new PermissiontreeBuilder(Container
                .getCurrentProduct().getProductId());
        PermissionTreeNode root = builder.getRoot();
        setTreeModel(new PermissionTreeModel(root));
    }
    return treeModel;
}

public void setTreeModel(PermissionTreeModel treeModel) {
    this.treeModel = treeModel;
}

}

insertNode()メソッドが正しく呼び出され、コンテンツを含む適切なノードを取得しますが、ノード(またはopen-attribute)のデータを変更しても、UIで何も起こりません。モデルの変更をツリーで有効にするには、特別なbind()メソッドなどを呼び出す必要がありますか?

4

1 に答える 1

2

さて、私は答えを見つけました:あなたは手動で(変数ごとに)変更についてUIに通知しなければなりません。

@NotifyChange({ "treeModel" })
@Command
public void insertNode(@BindingParam("node") PermissionTreeNode node) {
    PermissionTreeNode addNode = node;
    if(node.getChildren() == null) {
        PermissionItem item = node.getData();
        PermissionTreeNode parent = (PermissionTreeNode) node.getParent();
        int index = parent.getIndex(node);
        parent.remove(node);
        addNode = new PermissionTreeNode(item, new ArrayList<PermissionTreeNode>());
        parent.insert(addNode, index);
    }
    addNode.add(new PermissionTreeNode(new PermissionItem()));
}

NotifyChangeで、メソッド内で変更される変数を追加します。

于 2012-07-17T19:58:27.840 に答える