Wicket и Javascript: как Wicket может получать уведомления об обновлении текста?

Следующая ситуация:

Мое приложение Wicket работает в сочетании с javascript.

Например, есть страница с ярлыком. Эта метка имеет текст «ON»:

Label state = new Label("serverState", server.getStatus().getState());

server.getStatus().getState() в этот момент вернет «ON».

Также у меня есть javascript на этой странице, который будет обновлять эту метку «serverState» каждые 10 секунд. Возможно, он был изменен на «ВЫКЛ» (с помощью javascript).

Мой вопрос: есть ли способ получить уведомление об этом "текст ярлыка был изменен". Мне это нужно, потому что я хочу отобразить (setVisible(true)) другой компонент, но только если текст изменился.


person DaUser    schedule 20.08.2013    source источник


Ответы (4)


Вы можете добавить собственный AjaxEvent-Listener на свою метку. Затем ваш Javascript должен вызвать это событие после изменения переключателя с ON на OFF и обратно:

Label state = new Label("serverState", server.getStatus().getState());
state.setMarkupId("mylabelid");
state.add(new AjaxEventBehavior("updatestateON") {
  protected void onEvent(AjaxRequestTarget target) {
    // Do something; switch is ON now
  }
});

state.add(new AjaxEventBehavior("updatestateOFF") {
  protected void onEvent(AjaxRequestTarget target) {
    // Do something; switch is OFF now
  }
});

в Javascript вы вызываете эту функцию после изменения значения переключателя:

function triggerWicket(newstate) {
  if (newstate == 'ON') {
    $('#mylabelid').trigger('updatestateON');
  } else {
    $('#mylabelid').trigger('updatestateOFF');
  }
}
person Hans    schedule 21.08.2013

Я бы использовал AbstractDefaultAjaxBehavior и выполнял обновление на стороне сервера.

AbstractDefaultAjaxBehavior updateState = new AbstractDefaultAjaxBehavior()
{
  @Override
  protected void respond(AjaxRequestTarget _target)
  {
    String newState = RequestCycle.get().getRequest().getRequestParameters().getParameterValue("state").toString();
    state.setDefaultModel(newState)
    _target.add(state);
  }
};

Затем добавьте на веб-страницу функцию javascript при загрузке страницы и добавьте javascript в клиентский вызов updateState(state); с новым значением.

@Override
public void renderHead(IHeaderResponse response)
{
    super.renderHead(response);
    response.render(JavaScriptHeaderItem.forScript("function updateState(state) {Wicket.Ajax.get({'u':'"+ updateState.getCallbackUrl() +"&state=' + state})}", "updateState"));
}
person papkass    schedule 21.08.2013

Установите другой видимый Component по условию, которое вы упоминаете.

  Component otherComponent = new Component ("otherComponent"){
     @Override
     protected void onConfigure() {
        super.onConfigure();
        setVisible(server.getStatus().getState().eqaulsIgnoreCase("OFF"));
     }
  };
person Robert Niestroj    schedule 20.08.2013
comment
Это не правильное поведение. Это работает, только если я нажму F5, чтобы перезагрузить страницу. (НЕТ, даже не F5, потому что он содержит тот же экземпляр страницы, нужно ввести URL-адрес вручную). Но он обновляется через javascript. Это не заставляет страницу перезагружаться. Фрагмент JS: xxx.find(.textToUpdate).text(server.status.state); Как видите, он ищет только контейнер с этим идентификатором и устанавливает правильный текст. Уикет пока не получил уведомления. - person DaUser; 20.08.2013
comment
Как вы обновляете метку serverState? Поскольку, как вы сказали, это экземпляр одной страницы, и я сомневаюсь, что ваш JavaScript когда-либо изменит отображаемое значение. Я рекомендую для этого обновить метку i и переключить отображение другого компонента способом Wicket. - person Robert Niestroj; 20.08.2013
comment
Он обновляется с помощью javascript: это выглядит так: $(document).ready(function() { loadServerState(); window.setInterval(loadServerState, 5000); } var loadServerState() = function() { var x = $(# + server .id); ... x.find(.textToUpdate).text(server.status.state); //ищем метку для обновления } - person DaUser; 21.08.2013
comment
Я предлагаю использовать, как сказал Буурман, AjaxSelfUpdatingTimerBehavior , настроить компоненты, как я показал вам, и сделать все это на Java - The Wicket Way. - person Robert Niestroj; 21.08.2013
comment
Да, звучит как правильный путь. Я использую этот js, потому что он уже был там (перенес проект с jsp на калитку). Но я думаю, что скоро мне придется его изменить... Wicket Way звучит умнее ;) - person DaUser; 21.08.2013

Wicket — это веб-фреймворк на стороне сервера. Чтобы изменить содержимое или видимость компонентов, необходимо знать об измененных условиях на стороне сервера.

Предполагая, что server.getStatus().getState() на сервере будет отражать упомянутые вами изменения, вы можете использовать AjaxSelfUpdatingTimerBehavior для обновления (подмножества) компонентов на странице каждые X секунд/минут/и т. д. (Это основано на Duration).

РЕДАКТИРОВАТЬ: И когда компонент будет обновлен (добавлен в ajaxrequest), вы можете использовать ответ Роберта Нистроя, чтобы установить видимость второго компонента, поскольку onConfigure будет вызываться для каждого компонента, который добавляется в ajarequest (либо напрямую, либо по иерархии).

person Buurman    schedule 21.08.2013