Калитка: component.onBeforeRender против поведения.onBeforeRender - PullRequest
1 голос
/ 14 марта 2012

недавно мне нужно было определить видимость компонента в зависимости от видимости соответствующих дочерних компонентов (контейнер должен быть виден, если хотя бы один дочерний элемент виден).В связи с тем, что я устанавливаю видимость каждого компонента в соответствующих методах onConfigure (), я не могу использовать этот метод для удовлетворения моих потребностей.Поэтому я переключился на методы onBeforeRender и сделал там работу -> отлично работает.После этого я хотел извлечь это в поведение, так как это более многоразовое использование.Тем не менее я не могу использовать метод onconfigure, и я попробовал соответствующий beforeRender-метод.Но теперь wicket выдает исключение, утверждающее

"Невозможно изменить иерархию компонентов после начала фазы рендеринга (версия страницы больше не может измениться)"

Я думаю, что именование или поведение этого методастранно.Нет ли возможности решить это с помощью поведения?: (

Что ты думаешь?

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Я бы, вероятно, переопределил метод isVisible() контейнера, чтобы вызвать метод isVisible() всех его дочерних элементов (или, по крайней мере, пока один из них не вернет true).

Я предпочитаю переопределять isVisible() в целом, если видимость не зависит от внешних факторов (то есть чего-либо, кроме модели компонента или его дочерних элементов). Это намного удобнее для чтения. Очевидно, что вы должны остерегаться, если вы делаете это, чтобы никогда не вызывать дорогостоящие операции в вашей isVisible() реализации.

0 голосов
/ 19 марта 2012

Посмотрите на 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());
     *  }
     * }

Это основано на калитке 1.5

...