接下来我要用一个小应用来介绍基本的 CRUD 实作:复仇者英雄列表。它的功能如下:
显示列表又要提供选择功能的元件就是 ,因此我初步这样设计:
<zk xmlns:h="native">
<h:h3>复仇者英雄列表</h:h3>
<listbox id="heroBox" rows="5" emptyMessage="无资料">
...
</listbox>
</zk>
rows
能限制显示的最大项目数量,超过5 个就会自动产生垂直滚动条,让 Listbox 维持在固定高度,这样好处是能避免版面布局因为资料量不同而上下跳动emptyMessage
能设定当 listbox 没有资料要显示的讯息,避免只显示一个空白区域让使用者猜不出来那块区域是什麽作用以 MVC pattern 开发,需要实作控制器来呼叫服务类别来载入资料,首先宣告一个:
public class HeroController extends SelectorComposer {
@Wire
private Listbox heroBox;
虽然可以自行实作 Composer 介面,但一开始还是继承 ZK 内建的 SelectorComposer 比较省事,它提供如 CSS selector 语法的方式让你绑定元件与注册事件倾听器。
因为我要控制 Listbox 元件,因此也宣告一个 Listbox 变数加上 @Wire
。ZK 会自动将 zul 上生成的 Listbox 物件绑定到我的变数 heroBox
,不需要自己 new 物件。
public class HeroController extends SelectorComposer {
@Wire
private Listbox heroBox;
<listbox>
的 id,这样 ZK 才匹配得上listbox 元件本身也是采 MVC pattern 设计,因此资料物件(org.zkoss.zul.ListModelList) 与元件(org.zkoss.zul.Listbox
)是分开的,透过 setModel()
才将两者联系在一起。元件就像一个绘制器,预设是空的、没有资料,待我把资料(ListModelList
)塞给它之後,就会把资料绘制到浏览器上。
public class HeroController extends SelectorComposer {
@Wire
private Listbox heroBox;
private ListModelList<Hero> heroList = new ListModelList();
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
//在此初始化资料或元件
heroList.addAll(HeroService.getInitHero());
heroBox.setModel(heroList);
}
heroList
:用来储存一群 Hero 物件doAfterCompose()
这个生命周期方法是因为这个时机点,所有的元件与子元件都已经初始化完成,ZK 已经帮你把 heroBox
参照设好,你可以开始使用它。HeroService
代表一个後端服务类别,getInitHero()
会回传一个英雄清单。
<<: Day 10:一起了解 Angular 应用程序的启动流程(二)
>>: [C 语言笔记--Day11] Makefile 的粗略笔记
What should you do if the partition on your extern...
此篇会用好理解 (好笑) 的方式导览官网、原始码如何阅读,详细介绍会放在往後的文章。 官网 英文官...
一般而言,要安装 Linux,又要保留原本的系统,就得再先了解一下硬碟分割,通常都会以 GRUB ...
这篇只包含我自己不熟悉的题型,建议有看到文章的人自己做做看题目! 题目来自 六角学院 的 观念测验:...
前面谈到,执行[Machine Learning]的工作,除了计算资源外,最重要的便是资料了。我们先...