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);
        }});
      }
    }