afterCompose从不在初始化时执行

时间:2015-03-27 09:02:30

标签: zk

我有一个扩展窗口和implments IdSpace,AfterCompose的控制器。 但是,当控制器初始化时,函数afterCompose永远不会执行。无法弄清楚我错过了什么。我的这部分代码:

DataTemplateWindowController.java

public class DataTemplateWindowController extends Window implements IdSpace, AfterCompose {
   ...
   public DataTemplateWindowController() {
      Executions.createComponents("dataTemplate.zul", this, null);
      Selectors.wireComponents(this, this, false);
      Selectors.wireEventListeners(this, this);
   }

   @Override
   public void afterCompose() {
      Do something smart!!
   }
}

初始化。 的 HomeWindowController.java

public class HomeWindowController extends SelectorComposer<Component> {
    ...

    @Wire
    Window homeWindow;

    DataTemplateWindowController fa2;

    public void setDataTemplate() {
        fa2 = new FA2WindowController();
        fa2.setParent(homeWindow);
    }
}

页面加载正常,但是afterCompose函数永远不会执行。

我知道我可以避免实现AfterCompose然后在初始化后运行函数fa2.afterCompose()但我希望AfterCompose能够为我完成这项工作。

1 个答案:

答案 0 :(得分:1)

正如你在AfterCompose(of org.zkoss.zk.ui.ext.AfterCompose)接口的javadoc中看到的那样:

  

如果要知道何时创建ZK加载程序,则由组件实现   它。如果实现此接口,则调用{@link #afterCompose},   在ZK loader创建这个组件之后,它的所有子组件和   分配ZUML页面中定义的所有属性。这就是所谓的   &#34;构成&#34;

所以方法:&#34; afterCompose&#34;永远不会被你自己的java代码自动调用(在你的例子中你的方法setDataTemplate()中的代码)。只有在ZUL页面中使用组件时才会调用它。

你也可以在org.zkoss.zk.ui.ext.AfterCompose的Javadoc中看到:

  

如果是手动创建的,则调用{@ link#afterCompose}是调用者的工作。

如果您不需要在撰写过程后在您中设置任何属性或子项,请不要使用此界面并将您的代码放入构造函数中,否则,您必须手动调用它需要它(通常在你的SelectorComposer的doAfterCompose中):

public class HomeWindowController extends SelectorComposer<Component> {
    ...

    @Wire
    Window homeWindow;

    DataTemplateWindowController fa2;

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
        setDataTemplate();
    }

    public void setDataTemplate() {
        fa2 = new FA2WindowController();
        fa2.setParent(homeWindow);
        fa2.afterCompose();
    }
}