最近在研究DWZ框架,然后要写一个菜单树,后台我使用了SSH2,然后想把菜单通过后台传过来的对象展示出来。
但是,发现应用样式的时候,如果子菜单在子循环中为空的话,会多出一对空标签“<ul></ul>”,而DWZ的框架的样式,一旦发现标签<li>下出现标签“<ul></ul>”, 不论标签“<ul></ul>”里的内容是否为空,都会判断<li>为父级菜单,不是为最终的子菜单。
所以我只能在页面的父级循环中使用set标签设置一个变量flag,把需要迭代(iterator)的子菜单列表在父级菜单中先迭代一次,用来取得flag值,再用flag来判断(if标签)是否需要新建下一级子循环。
然后就是用iterator/set/if 组合使用来实现页面上的动态菜单树和DWZ样式的完美融合。
<div id="sidebar">
<div class="toggleCollapse">
<h2>主菜单</h2>
<div>收缩</div>
</div>
<div class="accordion" fillSpace="sidebar">
<div class="accordionHeader">
<h2>
<span>Folder</span>导航
</h2>
</div>
<div class="accordionContent">
<ul class="tree treeFolder">
<s:action name="menuTree"></s:action>
<s:iterator value="#attr.parentMenuTrees" status="index">
<s:set name="pId" value="id"></s:set>
<s:set name="flagId" value="'N'"></s:set>
<s:iterator value="#attr.subMenuTrees" status="index">
<s:if test="#pId==parentId">
<s:set name="flagId" value="'Y'"></s:set>
</s:if>
</s:iterator>
<li>
<a href="javascript:;" target="navTab"><s:property value="menuName" /> </a>
<s:if test="#flagId=='Y'">
<ul>
<s:iterator value="#attr.subMenuTrees" status="index">
<s:if test="#pId==parentId">
<li><a href="<s:property value="url"/>"
target="navTab"><s:property
value="menuName" /> </a></li>
</s:if>
</s:iterator>
</ul>
</s:if></li>
</s:iterator>
</ul>
</div>
</div>
</div>