最近我需要根据相应子组件的可见性来确定组件的可见性(如果至少有一个孩子可见,则应该可以看到容器)。 由于我正在设置相应onConfigure()中每个组件的可见性,因此我无法使用此方法来满足我的需求。所以我切换到onBeforeRender方法并在那里完成了工作 - >效果很好。 之后,我想将其提取为行为,因为这更可重用。仍然我不能使用onconfigure方法,我尝试了相应的beforeRender方法。但是现在检票口抛出一个声称
的例外“渲染阶段开始后无法修改组件层次结构(页面版本无法修改) 然后改变了)“
我认为这种方法的命名或行为都很奇怪。有没有可能用行为来解决这个问题? :(
你觉得怎么样?
答案 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