2012-07-17 110 views
2

我有關於模型與ZK6的新樹綁定機制綁定的問題。 首先,這裏是我的代碼:ZK - 數據變化後樹不刷新

祖爾:

<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()方法被正確調用,我也得到了適當的節點包含內容,但是當我更改節點的數據(或開放屬性)時,UI中沒有任何反應。我是否必須調用一些特殊的bind()方法或模型的更改才能在樹中生效?

回答

2

嗯,我找到了答案:你必須手動通知用戶界面進行更改(對於每個變量)。

@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中,您可以在方法中添加要更改的變量。