Wicket:component.onBeforeRender vs. behavior.onBeforeRender

时间:2012-03-14 10:10:33

标签: wicket

最近我需要根据相应子组件的可见性来确定组件的可见性(如果至少有一个孩子可见,则应该可以看到容器)。 由于我正在设置相应onConfigure()中每个组件的可见性,因此我无法使用此方法来满足我的需求。所以我切换到onBeforeRender方法并在那里完成了工作 - >效果很好。 之后,我想将其提取为行为,因为这更可重用。仍然我不能使用onconfigure方法,我尝试了相应的beforeRender方法。但是现在检票口抛出一个声称

的例外

“渲染阶段开始后无法修改组件层次结构(页面版本无法修改) 然后改变了)“

我认为这种方法的命名或行为都很奇怪。有没有可能用行为来解决这个问题? :(

你觉得怎么样?

2 个答案:

答案 0 :(得分:1)

我可能会覆盖容器的isVisible()方法来调用其所有子节点的isVisible()方法(或者至少在其中一个方法返回true之前)。

除非可见性取决于外部因素(即组件模型或其子项以外的任何其他因素),否则我更倾向于覆盖isVisible()。这种方式更具可读性。显然,如果你这样做,你需要注意的是永远不要在isVisible()实施中调用昂贵的操作。

答案 1 :(得分:0)

看一下EnclosureContainer,它实现了你所要求的,但对于一个孩子。应该很容易扩展到多个孩子。

诀窍是在容器的onConfigure中调用孩子的isVisible()方法:

public boolean isVisible()
{
    child.configure();
    return child.determineVisibility();
}

来自Component#onConfigure()

     * EG to link visiliby of
     * two markup containers the following should be done:
     * 
     * 
     * final WebMarkupContainer source=new WebMarkupContainer("a") {
     *  protected void onConfigure() {
     *    setVisible(Math.rand()>0.5f);
     *  }
     * };
     * 
     * WebMarkupContainer linked=new WebMarkupContainer("b") {
     *  protected void onConfigure() {
     *      source.configure(); // make sure source is configured
     *      setVisible(source.isVisible());
     *  }
     * }

这是基于Wicket 1.5