3

问题:
在 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>

现在,当Component使用它时,我想添加 children Components,例如,通过调用 in 中的initializeComponent函数MyCoolComponent

在我们的世界中,我们被教导在函数的生命周期阶段Composers处理所有此类工作。像这样的创造者也是如此吗?如果是这样,最好的(阅读:高效、安全、可读)方法是什么?我觉得为活动附加一个很草率。有什么想法吗?After ComposedoAfterComposeComponent@ListenonRender

4

2 回答 2

1

据我了解zk docsdoAfterCompose
如果您调用示例中的方法,则构造函数就像Selectors

但你喜欢做的可能是

public void setTitle(String title) {
  this.title = title;
    if(label != null)
      appendChild(new Label(title));
    else
      lebel.setValue(title);
}

zk 生命周期是,当进入一个 zul 组件时<MyComponent>
,它会调用构造函数,如果有类似title="Sean is Cool"
的东西它会调用 set 方法,如果这一切都完成了,Components它会创建页面。
这对你有帮助吗?

编辑

对于更复杂的结构,有两种选择

  1. 使用您需要的结构创建一个 zul 文件并使用Executions#CreateComponent
  2. 创建自己的zk-Component-Widget

什么是适合您的目的?

  • 选择 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 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);
    }});
  }
}

你也可以从你的主 zul 中调用Executions.CreateComponentsdoAfterCompose
但当然如果你想
在 zul 中设置值,这种onCreate方式会更好。
onCreate()工作中通过 java 添加组件也很好,
但是如果你在 zul 中写下东西,它会更加可修改/可维护。

现在让你用一句话来提问:
最好的时间是初始化你的Componentsis indoAfterCompose并列出到Create Event.

于 2013-01-16T16:31:50.653 回答
0

在 ZK 中,子节点会先于其父节点创建,您可以在子节点的 onCreate 事件触发时设置值,或者在 MyCoolDiv 的构造函数中添加监听 onCreate 事件的事件监听器,然后在该监听器中调用 init。

有关更多信息,请参阅 zk fiddle Div 测试中的示例

于 2013-01-16T16:13:23.880 回答