Java 何时在ZK生命周期中组成组件?
问题:Java 何时在ZK生命周期中组成组件?,java,zk,Java,Zk,问题: 在ZK中,当使用自定义组件时,生命周期中构建组件内容(任意复杂)的最佳时间是什么。也就是说,我们什么时候可以安全地假设我们拥有视图中的所有数据,而不必等待太久 详细信息: 在ZK中,我可以创建一个自定义组件MyCoolComponent: package my.package; public class MyCoolComponent extends Div { private String title; public MyCoolComponent() { Sel
在ZK中,当使用自定义组件时,生命周期中构建组件内容(任意复杂)的最佳时间是什么。也就是说,我们什么时候可以安全地假设我们拥有视图中的所有数据,而不必等待太久 详细信息:
在ZK中,我可以创建一个自定义组件
MyCoolComponent
:
package my.package;
public class MyCoolComponent extends Div {
private String title;
public MyCoolComponent() {
Selectors.wireVariables(this, this, Div.class);
Selectors.wireComponents(this, this, false);
Selectors.wireEventListeners(this, this);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
// When is the correct time to call this function?
public void initializeComponent() {
appendChild(new Label(title));
// arbitrarily complex initialization follows ..
}
}
我可以在zul文件中使用自定义组件,如下所示:
<?component name="coolcomponent" class="my.package.MyCoolComponent" ?>
<zk>
<coolcomponent id="cool" height="200px" title="Sean is Cool" />
</zk>
现在,当使用此组件时,我想添加子组件
,例如,通过调用myolcomponent
中的initializeComponent
函数
在作曲家的世界中
我们被教导在生命周期的创作后
阶段使用函数处理所有此类作品。对于这样创建的组件
是否也是如此?如果是这样的话,最好的方法是什么(读:高效、安全、可读)?我想附加一个@Listen
,因为onRender
事件太草率了。有什么想法吗?在ZK中,子节点将在其父节点之前创建,您可以在触发子节点的onCreate事件时设置值,或者在MyColdIV中添加监听onCreate事件的事件侦听器
s构造函数,然后在该侦听器中调用init
有关更多信息,请参考zk fiddle上的示例,据我所知,构造函数类似于doAfterCompose
,
如果调用示例中的选择器方法。
但你喜欢做的可能是
public void setTitle(String title) {
this.title = title;
if(label != null)
appendChild(new Label(title));
else
lebel.setValue(title);
}
当输入zul组件时,zk生命周期为
如果存在类似于title=“Sean很酷”
它调用set方法,如果对所有组件执行此操作,它将创建页面。
这对你有帮助吗
编辑
对于更复杂的结构,有两种选择
创建具有所需结构的zul文件,并使用或
创建自己的包
什么是适合你的目的
- 选择1。如果您有一个zk组件的结构,您希望(重新)使用。
论坛帖子的结构可能就是这样
- 选择2。如果您想
添加特殊功能,
优化/降低客户机-服务器通信成本,
为JavaScript库编写绑定,
在客户端保持较小的内存大小,
(即使对于复杂的结构,您也只需要一个类)
... .
当然,自有组件有许多好处,
但实施它们需要时间
那么生命周期是什么呢?对于选项2,请阅读文档。
对于选项1,在doAfterCompose
或事件侦听器/处理程序中执行此操作。
好的,下面是选项1的一个示例
主祖尔
<zk>
...
<div id="menu" use="myPkg.MyMenu" item1="omg" />
...
</zk>
...
...
我的菜单定义
<vbox>
<label id="item1" value="${arg.item1}">
...
</vbox>
...
爪哇
class MyMenu扩展Div{
字符串项1;
...
公共无效集合项1(字符串x){
第1项=x;
}
//在将数据发送到客户端之前触发onCreate,
//但在组件和所有it子组件存在之后。
创建时公共无效(CreateEvent ev){
CreateComponents(“MenuDef.zul”,这是一个新的HashMap(){{
付诸表决(“第1项”,第1项);
}});
}
}
您可以在doAfterCompose
当然,如果您想设置值,也可以使用主zul
在zul中,onCreate
方式更好。
通过java在onCreate()
中添加组件也很好,
但是如果你用zul写东西,它更容易编辑/维护。
现在用一句话回答你的问题:
最好的时机是在doAfterCompose
中初始化组件
,并通过在创建事件
中列出来简化示例,以强调我想要做的事情。向Div添加标签不是我的问题。我的问题是关于初始化自定义组件/小部件内容的最佳实践,无论它们的内容是标签还是其他内容。生命周期中的最佳点是什么?如何有效地利用它?在您更新的案例中,我认为您可以在构造函数完成后立即调用init方法。不,此时还没有调用setTitle。。这是我的问题。我提供的代码是一个,如果你测试代码,你会得到一个NPE与你的解决方案。对不起,有点误解你的问题,请参阅更新(更正)的答案。做了一些编辑,它可能会帮助你。如果没有,你的问题是什么,或者你认为会有什么问题?呃,我非常反对重载setter方法。当有人在API中看到setTitle时,约定建议他们可以假设它只做一件事。从setTitle函数影响DOM对我来说是一个糟糕的设计选择。请记住,这是一个视图
类,如果在视图中设置了某些内容,则必须更新显示的内容。那你想做什么呢?你认为zk在其组件中做了什么?看看zk课程。我理解,但我认为这是一条很好的路线。在这个例子中,我认为这种方法是可以接受的。但是在一个更复杂的组件中,有许多需要构建的部分,在一个位置一次构建会更干净。不只是一个带有标签的div,而是一个导航栏,或者一个演练向导窗口等等。我真的很想知道最好的地方和时间来初始化这些复杂的自定义组件。问题不是关于如何组织代码,而是标题,什么时候编写组件。我已经选择了你提出的第一个选项。现在的问题是,我什么时候编写组件。采用这种方法时,ZK生命周期中没有doAfterCompose
函数。
class MyMenu extends Div {
String item1;
...
public void setItem1(String x){
item1 = x;
}
// onCreate is fired before data is send to the client,
// but after the Component and all it children exists.
public void onCreate(CreateEvent ev){
Executions.CreateComponents("MenuDef.zul", this, new HashMap<String, Object>(){{
put("item1", item1);
}});
}
}