Как настроить ширину панели на основе другого компонента в wicket

#javascript #html #css #ajax #wicket

#javascript #HTML #css #ajax #wicket

Вопрос:

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

Разметка выглядит следующим образом:

 <div wicket:id="lazyPanel" style="float: left;"></div>
<div wicket:id="widthSpan" style="float: right; width: 30%;"></div>
  

и связанный Java-код является:

 final WebMarkupContainer widthSpan = new WebMarkupContainer("widthSpan");
add(widthSpan);
add(new AjaxLazyLoadPanel("lazyPanel") {
     public Component getLazyLoadComponent(String markupId) {
          // calculate the width based on widthSpan
          int width = 1000 - widthOf(sidebar);
          return new MyPanel(markupId, width);
     }
});
  

Я знаю, что могу использовать некоторый javascript для получения ширины боковой панели, но как я могу отправить его обратно в wicket?

Ответ №1:

Я нашел решение. Добавьте AJAX-поведение для widthSpan, например:

 widthSpan.add(new AbstractDefaultAjaxBehavior() {
     @Override
     protected CharSequence getCallbackScript() {
         return generateCallbackScript("wicketAjaxGet('"   getCallbackUrl()   
                      "amp;ExpectedWidth='   expectedWidth");
     }

     @Override
     public void renderHead(Component component, IHeaderResponse response) {
         super.renderHead(component, response);
         StringBuffer sb = new StringBuffer();
         sb.append("var expectedWidth = $('#")
           .append(getComponent().getMarkupId())
           .append("').width();");
         sb.append(getCallbackScript());
         response.renderOnDomReadyScript(sb.toString());
     }

     @Override
     protected void respond(AjaxRequestTarget target) {
         int width = RequestCycle.get().getRequest().getQueryParameters()
              .getParameterValue("ExpectedWidth").toInt(280);
         Component lazy = createComponent("lazyPanel", 1000 - width);
         target.add(lazy);
     }
 };
  

Здесь мы используем поведение для добавления параметра запроса ExpectedWidth, который будет получен из скрипта jquery, а в функции response мы создаем и добавляем фактическую панель.