Shadow Element:条件控制元件的创建、消灭

<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> 来控制是否有权限看到特殊按钮:

有权限
https://ithelp.ithome.com.tw/upload/images/20211001/20050621t6nsTmUyvj.jpg

无权限
https://ithelp.ithome.com.tw/upload/images/20211001/20050621eCProHDzPw.jpg

如果你打开浏览器的开发者工具 (按 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>  物件参照
  • permittedsetDynamicProperty() 传入 <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)

>>:  【Day 16】for 回圈

狗狗币的技术与理想的深入解析

或许你想问我 狗狗币有突出的技术吗? 它不是只是照抄程序码而诞生的加密货币吗? 事实并非如此, 我认...

5. STM32-NVIC Timer中断

前面文章有介绍到Delay的用法,Delay虽然也可以做到延迟或控制时间的效果,但严格来说透过De...

[Day 24] Android Studio 七日陨石开发:安装与创建第一个专案 (下)

前言 昨天我们安装好Android Studio, 并且建立了一个专案叫做AIFER。 现在我们尝试...

[DAY-12] 除去大部分控制 充分资讯 放心授权

加以控管 vs. 给予资讯 控管式 老板核准及指挥所有提案 行动和团队决策 有时候会直接监督 来控制...

[day-25] Python-例外处理!

甚麽是例外处理? 当Python在执行的时候,如果遇到无法处理的状况就会出现错误,导致整个程序卡住。...