Можно ли вкладывать тег wicket: child в другой компонент на странице? - PullRequest
4 голосов
/ 21 февраля 2011

В Wicket 1.4 я пытаюсь разрешить дочерним страницам изменять класс CSS для тега на родительской странице, что я делаю все время.Что странного в этом случае, так это то, что тег, на который я хочу нацелиться , оборачивает разметку дочерней страницы .Вот упрощенный фрагмент того, что я пробовал:

ParentPage.html

<div id="main" wicket:id="main">
  <wicket:child />
</div>

ParentPage.java

public abstract class ParentPage {

  private WebMarkupContainer main;

  protected ParentPage() {
    main = new WebMarkupContainer("main");
    add(main);
  }

  public void setClassAttr(String cssClass){
    main.add(SimpleAttributeModifier("class", cssClass);
  }
}

ChildPage.html

<wicket:extend>
  ...
</wicket:extend>

ChildPage.java

public class ChildPage extends Page {    
   ...

    public ChildPage() {
      super();
      ...     
      setClassAttr("specific-class-for-this-page");
    }
}

... Который взрывается, потому что кажется, что HTML из child загружает, но не Java.(Если я удаляю wicket: id и java-код на div#main, все в порядке.)

Обратите внимание, что тег parent , которым я хочу манипулировать изchild на самом деле оборачивает тег wicket:child.В других случаях я делал что-то похожее: теги, с которыми я хочу работать, обычно являются братьями и сестрами или иным образом удалены от тега wicket:child.

Все, что я действительно хочу сделать, - это позволить ребенку изменить классатрибут на родителя - есть ли другой способ сделать это?Почему дочерняя страница не может быть вложена в другой компонент страницы Wicket?

Ответы [ 6 ]

7 голосов
/ 25 сентября 2012

Я просто хотел бы отметить, что это было удалено с Wicket 1.5. Таким образом, если вы используете Wicket 1.5 или выше, вы должны использовать компонент TransparentWebMarkupContainer вместо WebMarkupContainer.isTansparentResolver(). У меня тоже была та же проблема, что и у постера. У меня есть внешний, содержащий div, который оборачивает тег wicket: child, и я настраиваю его ширину (жидкая сетка Twitter Bootstrap) на основе содержимого, которое нужно отобразить. Мой mainContentContainer является TransparentWebMarkupContainer:

<div class="row-fluid">
    <div class="span3" wicket:id="sidebarPanel"></div>
    <div class="span6" wicket:id="mainContentContainer">
        <wicket:child/>
    </div>
    <div class="span3" wicket:id="rightPanel"></div>
</div>

Иногда rightPanel полностью скрыт, а mainContentContainer меняется на class="span9", чтобы занять неиспользуемое окно просмотра.

Смотрите здесь .

Спасибо за публикацию. У меня была точно такая же проблема, пока я не прочитал этот пост.

3 голосов
/ 21 февраля 2011

Прежде всего, это не имеет ничего общего с фактической установкой атрибута, но с помещением <wicket:child> внутри контейнера.

Теперь представьте, если бы ChildPage было Panel, как бы выглядел код вашего ParentPage? Это будет содержать строку где-то, говорящую main.add( new ChildPanel() ). Вот как компонент main знает, что при рендеринге он также должен вызывать метод рендеринга вашей дочерней панели.

Но с наследованием все по-другому. Ваш main компонент не может знать, к чему <wicket:child> следует обращаться. Пометка прозрачного контейнера main указывает Wicket попросить родительский компонент (то есть компонент вашей страницы) разрешить и отобразить его.

1 голос
/ 09 января 2015

Полагаю, ваша дочерняя страница расширяет родительскую страницу.Почему бы не передать имя класса в конструктор родителя, как

public class ChildPage extends ParentPage {    
   public ChildPage() {
     super("my-class");
   }
}
1 голос
/ 31 июля 2012

отлично работает.на компоненте, где находится wicket: id = "main", делайте то, что выше.

ain = new WebMarkupContainer("main") {
    private static final long serialVersionUID = 1L;

    @Override
    public boolean isTransparentResolver() {
        return true;
    }
};

и исключение не происходит.

0 голосов
/ 28 августа 2013

Я думаю, что ваше использование калитки (или хотя бы код, который вы разместили) странно (я пробовал с 1.4.22) ...

public abstract class ParentPage {

Возможно, вы забыли extends WebPage.

public class ChildPage extends Page { 

здесь вы хотите расширить ParentPage Я полагаю.

Все работает, как ожидалось, и окончательный сгенерированный HTML-код

<div id="main" wicket:id="main" class="specific-class-for-this-page">
    <wicket:child>
        <wicket:extend>
            text
        </wicket:extend>
    </wicket:child>
</div>

Моя рекомендация - не использовать HTML-идентификатордля элементов калитки, когда вам не нужно ".

0 голосов
/ 21 февраля 2011

Сотрудник обнаружил исправление - сделайте компонент о теге wicket: child «transparentResolver».+1 любому, кто может четко сформулировать, как это работает точно?

    main = new WebMarkupContainer("main") {
        private static final long serialVersionUID = 1L;
        @Override
        public boolean isTransparentResolver() {
            return true;
        }
    };
    add(main);
...