<if>
条件控制<if>
元素根据 test
属性中的评估值决定其下的元件是否创建:
<if test="${empty sessionScope.user}">
未登入
</if>
但没有 else 语法,因此如果 else 情形需要创建别的元件,则要写两个 <if>
或是使用 <choose>
, <when>
, <otherwise>
。
以 MVC 模式来说,原本就可以呼叫 Component.detach()
把元件移除,因此 <if>
只是提供一个简便的、可在 zul 上使用的方法。而被 <if>
移除的元件,是的确在服务器端与浏览器端都不存在,而不只是透过 display:none
隐藏的。因此可以节省记忆体,因为元件对应的 Java 物件都移除了。也能提高浏览器端安全性,因为如果只是隐藏按钮,稍懂 browser developer tool 的人都能轻易把按钮恢复显示。因此如果你要因使用者权限不同来显示不同的介面时,建议要消灭元件,比隐藏会更安全。
以下例子,我以 <checkbox>
来控制是否有权限看到特殊按钮:
有权限
无权限
如果你打开浏览器的开发者工具 (按 F12),检查 checkbox 下方的 DOM 元素,你会发现当按钮消失时,的确连 <button>
对应的 DOM element 都移除,而不是被 CSS 隐藏。
<div apply="quickstart.shadow.PermissionComposer" sclass="box">
<checkbox label="toggle permission" style="margin-bottom: 30px"/>
<apply id="permission" dynamicValue="true">
<if test="${permitted}">
<div>权限已被核准</div>
<button label="特殊按钮" style="background-color:orange"/>
</if>
</apply>
</div>
public class PermissionComposer extends SelectorComposer {
@Wire("::shadow#permission")
private Apply permissionArea;
private boolean permitted = false;
@Listen(Events.ON_CHECK+ "= checkbox")
public void togglePermission(CheckEvent event){
permitted = !permitted;
permissionArea.setDynamicProperty("permitted", permitted);
permissionArea.recreate();
}
}
@Wire
取得 <template>
物件参照permitted
用 setDynamicProperty()
传入 <template>
中recreate()
重建范本,使 <if>
重新估值<choose><when><otherwise>
元素这个用法很好理解,我就用一个例子简单介绍。以下是根据 query string 参数来决定产生什麽元件。例如:http://localhost:8080/zkquickstart/shadow/permission.zul?type=string 就产生 <textbox>
<div sclass="box">
参数决定输入元件的类别
<choose>
<when test="${param.type eq 'string'}">
<textbox/>
</when>
<when test="${param.type eq 'date'}">
<datebox/>
</when>
<otherwise>
<intbox/>
</otherwise>
</choose>
</div>
<<: [Day 17] Reactive Programming - Reactor Test(StepVerifier)
或许你想问我 狗狗币有突出的技术吗? 它不是只是照抄程序码而诞生的加密货币吗? 事实并非如此, 我认...
前面文章有介绍到Delay的用法,Delay虽然也可以做到延迟或控制时间的效果,但严格来说透过De...
前言 昨天我们安装好Android Studio, 并且建立了一个专案叫做AIFER。 现在我们尝试...
加以控管 vs. 给予资讯 控管式 老板核准及指挥所有提案 行动和团队决策 有时候会直接监督 来控制...
甚麽是例外处理? 当Python在执行的时候,如果遇到无法处理的状况就会出现错误,导致整个程序卡住。...